トップ回答者
Invoke-WMIMethod実行時のエラー

質問
-
いつもお世話になります。
下記コマンドを実行したところ
【Invoke-WMIMethod -ComputerName サーバ名 Win32_Process -Name create -ArgumentList ("cmd.exe /c バッチファイル.bat")】
アクセス拒否のメッセージが返ってきました。
Invoke-WmiMethod : アクセスが拒否されました。 (HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))
発生場所 行:1 文字:17
+ Invoke-WMIMethod <<<< -ComputerName サーバ名 Win32_Process -Name create -ArgumentList ("cmd.exe /c バッチファイル名.bat")
+ CategoryInfo : NotSpecified: (:) [Invoke-WmiMethod]、UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.InvokeWmiMethod受け側のほうで
Get-ExecutionPolicyを実行すると、
Remote Signed
と表示されるので、ポリシーには問題が無いようです。
サーバ名を変えて別サーバで実行すると問題なく動作するので、何か設定漏れがあるのだと思います。
あと何を確認すればいいのか、ご教授ください。
よろしくお願いいたします。
回答
-
アクセス拒否ということは対象コンピュータにアクセス権がないということなので、アクセス権を持ったユーザーで実行すればいいかと思います。
PowerShellコンソールからInvoke-WmiMethodコマンドレットを実行する場合、PowerShellコンソールを実行したユーザー(=powershell.exeをデスクトップから手動で実行した場合はログオンユーザー)の権限を使ってリモートコンピュータにアクセスします。
したがって、スクリプトを実行したユーザーが、対象コンピュータでWMI経由でプロセスを作成する権限を持っていないとアクセス拒否エラーとなります。
よって対処法としては、
1. 対象コンピュータに、スクリプト実行ユーザーがアクセスできるように権限を付与する
2. 対象コンピュータにアクセス権限があるユーザーアカウントを-Credentialパラメータに指定して実行する
3. タスクスケジューラで実行する場合は、アクセス権限があるユーザーアカウントを指定する
のいずれかになるかと思われます。
なお、Invoke-WmiMethodコマンドレットを用いたWMIでのリモート実行は、WinRMを利用するPowerShell Remotingとは別物ですので、対象コンピュータのスクリプト実行ポリシーはどんな設定になっていても関係ありません。
- 回答としてマーク qoo_man 2013年11月26日 7:58
すべての返信
-
アクセス拒否ということは対象コンピュータにアクセス権がないということなので、アクセス権を持ったユーザーで実行すればいいかと思います。
PowerShellコンソールからInvoke-WmiMethodコマンドレットを実行する場合、PowerShellコンソールを実行したユーザー(=powershell.exeをデスクトップから手動で実行した場合はログオンユーザー)の権限を使ってリモートコンピュータにアクセスします。
したがって、スクリプトを実行したユーザーが、対象コンピュータでWMI経由でプロセスを作成する権限を持っていないとアクセス拒否エラーとなります。
よって対処法としては、
1. 対象コンピュータに、スクリプト実行ユーザーがアクセスできるように権限を付与する
2. 対象コンピュータにアクセス権限があるユーザーアカウントを-Credentialパラメータに指定して実行する
3. タスクスケジューラで実行する場合は、アクセス権限があるユーザーアカウントを指定する
のいずれかになるかと思われます。
なお、Invoke-WmiMethodコマンドレットを用いたWMIでのリモート実行は、WinRMを利用するPowerShell Remotingとは別物ですので、対象コンピュータのスクリプト実行ポリシーはどんな設定になっていても関係ありません。
- 回答としてマーク qoo_man 2013年11月26日 7:58
-
牟田口様
いつもお世話になっております。
2番を基本的に使うこととしました。
minminnana様がされているブログに参考となる情報がありましたので、それをつかってみました。
$password = ConvertTo-SecureString "HOGEPASS" -asplaintext -force
$cred = New-Object System.Management.Automation.PsCredential "HOGEUSER",$password
Invoke-WMIMethod -ComputerName サーバ名 Win32_Process -Name create -ArgumentList ("cmd.exe /c バッチ名 引数") -Credential $cred
これにより、ダイヤログボックスも出ずに、バッチが実行できました。
ありがとうございました。