【Start-Process】PowerShellから管理者として実行させるテクニック

こんにちは。チェシャ男です。(-皿-)

今回は、

【PowerShell から管理者権限でプロセスを起動する方法】

についてご紹介します。

Start-Process コマンドレットで「管理者として実行」したい場合は”管理者“と”管理者権限“の2つを指定しなければなりません。

管理者として実行する場合だけでなく特定のユーザで実行させたい場合にも応用できます。

別プロセスを起動する基本的な方法についてはこちら↓の記事をご参考ください。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/start-process/”]

 

実行時のユーザを指定する

プロセスを開始するコマンドレット

Start-Process

の使い方は以下をご覧ください。

【コマンドレット】

Start-Process

【オプション】

パターン1
-FilePath <実行ファイルパス>
-ArgumentList <開始プロセスの引数>
-Credential <ユーザ情報>
-WorkingDirectory <string>
-LoadUserProfile
-NoNewWindow
-PassThru
-RedirectStandardError <プロセス上のエラー出力先>
-RedirectStandardInput <プロセスへの入力ファイル>
-RedirectStandardOutput <プロセスからの出力ファイル>
-WindowStyle <ウィンドウの状態>
-Wait
-UseNewEnvironment

パターン2
-FilePath <実行ファイルパス>
-ArgumentList <開始プロセスの引数>
-WorkingDirectory <プロセスの実行場所>
-PassThru
-Verb <プロセス開始時の動作>
-WindowStyle <ウィンドウの状態>
-Wait

【入力】

None

【出力】

None
System.Diagnostics.Process

【エイリアス】

saps
start

プロセスとは何か」については「プロセスとは…」をご覧下さい。

デフォルトでは操作中のユーザで実行される

Start-Process コマンドレットで実行される新しいプロセスは基本的に操作中のユーザ情報で実行されます。

下の実行結果を見てください。

PS C:\work> #操作中のユーザ名
PS C:\work> Get-Item Env:\USERNAME

Name                Value
----                ----
USERNAME            cheshire-boy


PS C:\work>
PS C:\work> #単純にPowerShellを起動してみる
PS C:\work> $proc = Start-Process -FilePath powershell -PassThru
PS C:\work>
PS C:\work> #起動したプロセスのユーザを確認する
PS C:\work> Get-Process -InputObject $proc -IncludeUserName

Handles      WS(K) VM(M)   CPU(s)     Id UserName                   ProcessName
-------      ----- -----   ------   ---- --------                   -----------
    316      37748   203     0.23   6128 CHESHIRE-PC\cheshire-boy   powershell

Get-Process “-IncludeUserName” オプションを使用することでプロセスの実行ユーザを表示させることができます。

[blogcard url=”https://cheshire-wara.com/powershell/ps-cmdlets/system-service/get-process-option/”]

実行結果を見てみると操作中のユーザ(cheshire-boy)と起動したプロセスのユーザ (cheshire-boy) 同じであることがわかりますね。

このように Start-Process コマンドレットのデフォルトではプロセス開始時のユーザ情報は操作中のユーザが使用されます。

“Credential” オプションで別の資格情報を指定する

では、他のユーザ情報で実行…つまり別の資格情報を使用してプロセスを開始するにはどうするのでしょうか。

資格情報 … ユーザのユーザ名パスワード

ちなみに「他のユーザで実行する」とは、

ユーザAでログインしながらユーザBとして操作する

というような状態を表します。

Start-Process コマンドレットには “-Credential” オプションが用意されています。直訳で 「Credential ⇒ 資格 」なのでそのままですね。

Credential オプションで実行時に使用したい他のユーザの

  • ユーザ
  • パスワード

を入力することで「別ユーザとして実行」することができます。

使い方は

Start-Process <実行ファイル> -Credential ユーザ名

です。

使用方法に合わせて以下のコマンドレットを実行してみましょう。

PS C:\work> Start-Process -FilePath powershell -Credential Hoge -PassThru

実際に実行してみると↓のように資格情報を入力するウィンドウが表示されます。

資格情報入力欄-チェシャわら

この画面で正しいパスワードを入力し認証に成功すると指定したユーザでプロセスが開始されます。

上記コマンドレットの場合であれば「別のユーザ Hoge」で新たに PowerShell を立ち上げることができるはずです。

この時のコマンドレットを実行した側のPowerShell画面からは、

PS C:\work> #HogeユーザでPowerShellを開始
PS C:\work> Start-Process -FilePath powershell -Credential Hoge -PassThru

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
      4       1      144        836     6     0.00   1100   1 powershell


PS C:\work>
PS C:\work> #開始したプロセス(ID:1100)の実行ユーザを確認
PS C:\work> Get-Process -PID 1100 -IncludeUserName

Handles      WS(K) VM(M)   CPU(s)     Id UserName                    ProcessName
-------      ----- -----   ------     -- --------                     -----------
    330      37688   204     0.19   1100 CHESHIRE-PC\Hoge     powershell

このように Hoge ユーザで PowerShell が開始されたことを確認できます。

ちなみに新しく立ち上がった Hoge ユーザの Poweshell で自分の名前を確認してみると Hoge であることがわかります。

Windows PowerShell
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\work> Get-Item Env:\USERNAME

Name                           Value
----                           -----
USERNAME                       Hoge

このように Start-Process コマンドレットでは “Cridental” オプションを使うことで他のユーザとしてプロセスを起動することができます。

“Verb” オプションとは…

突然ですが、ここで “Verb” オプションの説明に入ります。

通常の英単語【Verb】とは日本語で「動詞」の事を表しますが PowerShell の場合は

ユーザが行う操作やアクション

の事を指します。

【ユーザ操作の例】

・ファイルを開く
プリントアウトする
・クリックして実行する
・アプリケーションを起動する
・音楽を再生する
・動画を再生する   … etc.

このようにユーザが行う操作は様々ですが基本的にファイルの種類毎に「何ができるか・どんな操作が可能か」が決まっています。

テキストファイル ⇒ 印刷する、編集する
実行ファイル   ⇒ 実行する、管理者として実行する、開く
音楽ファイル   ⇒ 再生する、キューに入れる

これをもう少しシステム的に言い換えるとファイルの操作はファイルの拡張子(.exe .txt .mp3 .ps1)単位に決められています。

テキストファイル = .txt  ⇒ 印刷する、編集する
実行ファイル   = .exe   ⇒ 実行する、管理者として実行する、開く
音楽ファイル   = .mp3 ⇒ 再生する、キューに入れる

何となく想像はつきましたか?

“Verb” オプションで起動時の動作を指定する

Verb” とは ”ユーザが行う操作” であると説明しました。

その名の通り Start-Process コマンドレットで ”-Verb” オプションを使用することで、「プロセス開始時の動作」を指定してあげることが可能です。

Start-Process
AAA.txt を メモ帳 で 開く
BBB.txt を メモ帳 で 印刷する

のように赤字の部分を指定できます。

使い方は、

Start-Process <対象> -Verb <動作・操作>

です。

PS C:\work> #テキストファイルを印刷
PS C:\work> Start-Process -FilePath .\Hoge.txt -Verb print -PassThru

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
      3       1      272        908     7     0.00   4880   1 notepad

するとチェシャ男の環境では下の画像のように XPS ファイルに出力しようとするウィンドウが立ち上がってきました。

verb指定-チェシャわら

今まではメモ帳画面でテキストファイルが開かれていたので ”Verb” オプションで確かに動作が指定されていますね。

そもそも何の操作ができるわからない! _(:3 」∠)_

という場合には「System.Diagnostics.ProcessStartInfo」クラスを参照することで確認できます。

(New-Object System.Diagnostics.ProcessStartInfo <拡張子>).Verbs

と実行することで ”Verb” で指定可能な動作・操作を調べることができます。

PS C:\work> #テキストファイル
PS C:\work> (New-Object System.Diagnostics.ProcessStartInfo .txt).Verbs
open
print
printto

PS C:\work> #実行ファイル
PS C:\work> (New-Object System.Diagnostics.ProcessStartInfo .exe).Verbs
open
runas
runasuser

PS C:\work> #音楽ファイル
PS C:\work> (New-Object System.Diagnostics.ProcessStartInfo .mp3).Verbs
Enqueue
open
Play

ここからは実行ファイルの動作 (Verb) に焦点を当てて

open
runas
runasuser

について話していきます。

“Verb” オプションの「runAs」で管理者として実行

”Verb” オプションで実行ファイルに指定ができる操作を調べてみると、

PS C:\work> #実行ファイル
PS C:\work> (New-Object System.Diagnostics.ProcessStartInfo .exe).Verbs
open
runas
runasuser

の3つがあることがわかりました。

それぞれ

open    => 通常実行
runas   => 管理者権限で実行
runasuser => 別のユーザとして実行

という意味です。

「通常実行」は説明しなくても問題ないと思います。

「別のユーザとして実行」はこの記事の前半で説明した内容とほぼ同じです。

「管理者権限で実行」というのは右クリックメニューに出てくるメニューの

右クリックメニュー-チェシャわら

「管理者として実行(A)」と同じ動作です。

つまり今まで

[実行ファイル]-[右クリック]-[管理者として実行]

としていた動作を Start-Process コマンドレットから

Start-Process <実行ファイル> -Verb ranAs

ので1行で実行することができます。実際に実行すると

PS C:\work> Start-Process -FilePath powershell -Verb runAs -PassThru

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
      3       1      144        800     6     0.00   4648   1 powershell

このように管理者権限を持った PowerShell が起動してきます。

管理者権限として起動-チェシャわら

※UAC(ユーザアカウント制御)が有効な場合はポップアップが表示されます

 “Credential” と “Verb” オプションの共存

ここまで「別のユーザとして実行する」方法や「管理者として実行する」方法を紹介してきましたが、

他の管理者ユーザとして管理権限で実行したい

という場合はどうすればよいでしょうか。

単純に “Credential” と “Verb” オプションの両方を指定して実行してみると、

PS C:\work> Start-Process -FilePath powershell -Credential Hoge -Verb runas
Start-Process : 指定された名前のパラメーターを使用してパラメーター セットを解決できません。
発生場所 行:1 文字:1
+ Start-Process -FilePath powershell -Credential Hoge -Verb runas
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Process]、ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands.StartProcessCommand

このようにエラーになってしまいます。

冒頭のコマンドレットの使い方パターンにも書いているように “Credential” と “Verb” オプションは使用する構文パターンが異なります。そのため同時に指定しようとすると

そんなパラメータセット(パラメータ指定方法)はありません!

と怒られてしまうんです。

どうしても他の管理者ユーザとして管理権限で実行したい時は、

(苦肉の策ですが…)
① 他の管理者ユーザで PowerShell を実行
② 引数に実行ファイルと管理者権限を指定

という不格好な方法で指定することができます。

PS C:\work> #引数となる「管理者権限で実行」部分(②のところ)
PS C:\work> $arg = "Start-Process -FilePath powershell -Verb runAs"
PS C:\work>
PS C:\work> #「管理者ユーザ」を指定して実行部分(①のところ)
PS C:\work> Start-Process -FilePath powershell -Credential Hoge -ArgumentList $arg -PassThru

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
      4       1      144        832     6     0.02   5928   1 powershell

すると、

管理者で管理権限で実行-チェシャわら

このように管理者として起動させることに成功しました。

Windows PowerShell
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\work> Get-Item Env:\USERNAME

Name                           Value
----                           -----
USERNAME                       Hoge

このようにユーザも指定した”Hoge”ですね。

まとめ

別のユーザとして実行したい場合は

①Start-Process <実行ファイル> -Credential <ユーザ名>

or

②Start-Process <実行ファイル> -Verb runasuser

を使用する。

管理者権限で実行したい場合は、

Start-Process <実行ファイル> -Verb runas

を使用する。

5 COMMENTS

となりのトトロ

チェシャ男さん

こんにちは★
お知恵をお借りしたいことがございます。

VBAでPowershellをまさに、”他の管理者ユーザとして管理権限”として
動かしたいのです。

VBAのコードは、

Sub Test_Sample_Miniature()

Dim WSH As Object
Dim cmdstr As String
Dim Result
Set WSH = CreateObject(“WScript.Shell”)
cmdstr = Chr(34) & “& {※ここにPowerShellのコマンド}” & Chr(34)
Result = WSH.Run(“PowerShell -NoExit -nologo -ExecutionPolicy Bypass -Command ” & cmdstr, 4, True)
Set WSH = Nothing
End Sub

★ちなみに、実行させたいコマンドレットは、以下のドメインユーザーへ
セキュリティグループを追加するというものです。

“”グループA”,”グループB” | Add-ADGroupMember -Members ”

ここのコマンドをどうVBAのコードに組み込めばいいか分かりますでしょうか?

よろしくお願いいたします。

返信する
匿名

大変参考になります。ところで、UACのダイアログボックスを表示させないために、-Credential の引数にユーザ名とパスワードを一緒に渡すことはできませんか?

返信する
チェシャ 男

タコ様
コメントありがとうございます。
お力になれずすみません(´;ω;`)

差し支えなければどの辺りが詰まったか教えていただけますでしょうか!

返信する

となりのトトロ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。