こんにちは。チェシャ男です。(-皿-)
今回は、
【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” オプションで確かに動作が指定されていますね。
そもそも何の操作ができるわからない! _(: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
を使用する。
チェシャ男さん
こんにちは★
お知恵をお借りしたいことがございます。
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 の引数にユーザ名とパスワードを一緒に渡すことはできませんか?
>>匿名さん
簡易的なコマンドレットですが
https://gist.github.com/cheshirewara/1cb5cbaefc5dee575feff8a8c58589ce
の様にSystem.Management.Automation.PSCredentialで文字列情報から
Credential情報を生成することができます。
Start-Process powershell -Credential (New-PSCredential “user” “pass”)
のように一緒に渡すことは可能です。
役に立たなかった:1
タコ様
コメントありがとうございます。
お力になれずすみません(´;ω;`)
差し支えなければどの辺りが詰まったか教えていただけますでしょうか!