Function Reference

RunAsWait

別ユーザーの権限で外部プログラムを実行し、そのプログラムが終了するまでスクリプトの実行を一時停止します。

RunAsWait ( "username", "domain", "password", logon_flag, "program" [, "workingdir" [, show_flag [, opt_flag ]]] )

 

パラメータ

username ログオンするユーザー名
domain 認証ドメイン
password ユーザーのパスワード
logon_flag 0 - プロフィールなしの対話型ログオン
1 - プロフィールありの対話型ログオン
2 - ネットワーク信認のみ
4 - ユーザーの代わりに呼び出しプロセスの環境を継承
program 実行するプログラム(EXE、BAT、COM、またはPIF)のフルパス(注意を参照)
workingdir [オプション] 作業ディレクトリ。指定しない場合、@SystemDirが使用されます。これはプログラムのパスではありません。
show_flag [オプション] 実行プログラムの"表示"フラグ:
  @SW_HIDE = 非表示ウィンドウ (デフォルト)
  @SW_MINIMIZE = 最小化ウィンドウ
  @SW_MAXIMIZE = 最大化ウィンドウ
opt_flag [オプション] 親プロセスと子プロセスの連携方法に関連したさまざまなオプションを制御します。
  0x10000 ($RUN_CREATE_NEW_CONSOLE) = 子コンソールプロセスは親のウィンドウを使用する代わりに独自のウィンドウを作成します。 このフラグは親をコンソールアプリケーションとしてコンパイルした場合のみ使用できます。

 

返し値

成功 実行したプログラムの終了コードを返します。
失敗 0を返し、@errorを非ゼロに設定します。

 

注意

スペースを含むパスはコーテーションマークで囲む必要があります。

実行時にアクセスする作業ディレクトリはユーザーに指定させることが重要です。さもないとこの関数が失敗することがあります。

ユーザーのプロフィールは確実に必要な場合のみロードすることをお勧めします。正しい状態でメモリにプロフィールをスタックできることは稀です。RunAs()を使ったスクリプトをSYSTEMアカウントで実行し(例えばスクリプトをサービスとして実行している場合)、ユーザーのプロフィールがロードされる場合は子プロセスが終了するまでスクリプトの実行が継続するように注意する必要があります。

管理者として実行する場合はSecondary Logon(RunAs)サービスが有効にされている必要があります。さもないとこの関数は失敗します。これはSYSTEMアカウントで実行する際は関係ありません。

要求されたプログラムを実行した後、そのプログラムが終了するまでスクリプトは一時停止します。プログラムを実行し、その後ただちにスクリプト実行を継続するには代わりにRunAs関数を使用してください。

プログラムの中には まだ実行中にも関わらず直ちに処理が返されるように見えるものがあります。これらのプログラムは別のプロセスを立ち上げています - ProcessWaitCloseを使用することでこういった場合の処理を制御することができます。

"プロフィールロード"オプションと"ネットワーク信認のみ"オプションを組み合わせることはできません。両方を使用した場合、未定義の結果が返ります。

Windows XPではウィンドウ生成がSTDIOリダイレクションと表示フラグの動作を妨害するという問題があります。Microsoft Knowledge Baseの記事KB818858にどのバージョンでこの問題が起きるか、ホットフィックスする必要があるかの詳細な情報がありますので参照してください。Windows 2000、Windows XP SP2以降、Windows Vistaではこの問題はありません。

 

関連

ProcessWait, ProcessWaitClose, Run, RunWait, ShellExecute, ShellExecuteWait, RunAs

 


; 実行するシステムのユーザー名とパスワードを正しく設定すること
Local $sUserName = "Username"
Local $sPassword = "Password"

; 別ユーザーとしてコマンドプロンプトを実行
Local $pid = RunAsWait($sUserName, @ComputerName, $sPassword, 0, @ComSpec, @SystemDir)

; プロセスが終了するまで待機
ProcessWaitClose($pid)

; メッセージを表示
MsgBox(0, "", "The process we were waiting for has closed.")