.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」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH