.NET TIPS

別のユーザーでほかのアプリケーションを実行するには?[C#、VB、2.0、3.0、3.5]

デジタルアドバンテージ 一色 政彦
2009/05/21

 「TIPS:ほかのアプリケーションを実行するには?」では、Processクラス(System.Diagnostics名前空間)の静的メソッドであるStartメソッドを使って、プログラム内からほかのアプリケーションを実行する方法を紹介している。

 この際、現在のユーザーとは別のユーザーでほかのアプリケーションを実行したい場合、.NET Framework 2.0以降で導入された、Startメソッドの新しいオーバーロードを使えばよい。このオーバーロードでは以下の順に引数を指定する。

  • アプリケーションのファイル・パス
  • コマンドライン引数(省略可)
  • ユーザー名
  • パスワード
  • ドメイン

 パスワード以外は通常の文字列(=Stringオブジェクト)として指定すればよいが、パスワードはSecureStringクラス(System.Security名前空間)のオブジェクトとして指定する必要がある。

 SecureStringクラスは、.NET Framework 2.0で搭載されたもので、文字列を暗号化したうえでメモリ上に展開し、メモリ上に配置されたデータの破棄を確実に行う機能(=ClearメソッドやDisposeメソッド)を備えている。そのため、Stringクラスよりもより安全に文字列を扱える(=第三者のプログラムによってメモリ上のパスワード文字列を読み取られて盗用される危険性が低減される)。このような特徴から、SecureStringクラスは特に、クレジットカード番号やパスワードなどの機密情報を扱うのに適している。

 SecureStringクラスを使うには、そのインスタンスを生成してから、AppendCharメソッドにより(文字列を)1文字ずつ追加していく必要がある。コンソール・アプリケーションの場合は、次のようなコードになる。

SecureString password = new SecureString();

foreach (char oneChar in Console.ReadLine()) {
  password.AppendChar(oneChar);
}
Dim password As New SecureString()

For Each oneChar As Char In Console.ReadLine()
  password.AppendChar(oneChar)
Next
SecureStringクラスにおける文字列の構築(上:C#、下:VB)

 そして次のコードは、Process.Startメソッドを使って、別のユーザーでほかのアプリケーションを実行するコンソール・アプリケーションのサンプル・プログラムだ。上記で「(省略可)」となっていた「コマンドライン引数」は指定していない。

using System;
using System.Security;
using System.Diagnostics;

class Program
{
  static void Main()
  {
    string filePath = @"ShowUserName.exe";
    string domain = "dapc87";
    string userName = "masa-i";

    Console.WriteLine("パスワードを入力してください");
    SecureString password = new SecureString();
    foreach (char oneChar in Console.ReadLine())
    {
      password.AppendChar(oneChar);
    }

    Process.Start(filePath, userName, password, domain);
  }
}
Imports System.Security

Module Module1

  Sub Main()
    Dim filePath As String = "ShowUserName.exe"
    Dim domain As String = "dapc87"
    Dim userName As String = "masa-i"

    Console.WriteLine("パスワードを入力してください")
    Dim password As New SecureString()
    For Each oneChar As Char In Console.ReadLine()
      password.AppendChar(oneChar)
    Next

    Process.Start(filePath, userName, password, domain)
  End Sub

End Module
別のユーザーでほかのアプリケーションを実行するサンプル・プログラム(上:C#、下:VB)

 ドメイン・ユーザーではなくローカル・ユーザーの場合は、ドメイン名にnull/Nothingを指定すればよい。

 なお、「TIPS:コマンド・プロンプトを表示せずにコンソール・アプリケーションを実行するには?」のようにProcessStartInfoクラス(System.Diagnostics名前空間)を使う場合は、ProcessStartInfoオブジェクトの、

  • Domainプロパティ:ドメイン
  • UserNameプロパティ:ユーザー名
  • Passwordプロパティ:パスワード

を利用すればよい。ローカル・ユーザーの場合はDomainプロパティを指定しなくてよい。End of Article

利用可能バージョン:.NET Framework 2.0以降
カテゴリ:クラス・ライブラリ 処理対象:Windows環境
使用ライブラリ:Processクラス(System.Diagnostics名前空間)
使用ライブラリ:ProcessStartInfoクラス(System.Diagnostics名前空間)
使用ライブラリ:X509Certificateクラス(System.Security.Cryptography.X509Certificates名前空間)
関連TIPS:ほかのアプリケーションを実行するには?
関連TIPS:コマンド・プロンプトを表示せずにコンソール・アプリケーションを実行するには?

この記事と関連性の高い別の.NET TIPS
コンソール・アプリケーションの出力を取り込むには?
ほかのアプリケーションを実行してその終了を待つには?
ほかのアプリケーションを実行するには?
管理者としてほかのアプリケーションを実行するには?
コマンド・プロンプトを表示せずにコンソール・アプリケーションを実行するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間