web-dev-qa-db-ja.com

PowerShellスクリプトで管理者としてコマンドを実行します。 UAC

OKここに私の問題があります:

サーバー上でスクリプトをリモートで実行しようとしています。

私は両方のボックスの管理者であり、ファイアウォールの例外が設定されており、リモート管理者が有効になっています。

invoke-command -ComputerName $ComputerName -ScriptBlock `
{
    cd C:\Windows\System32\inetsrv\; 
    ./appcmd.exe ADD vdir /app.name:<SiteName>/ /path:/<VDir Name> /physicalPath:<Path to files>
}

代わりに次のエラーが発生し続けます

ERROR ( hresult:80070005, message:Failed to commit configuration changes. Access is denied.

実行しようとしているサーバーはサーバー2k8R2ボックスであり、問​​題はUACの問題だと思います。 UACボックスで[はい]をクリックせずに、これを管理者として実行する方法はありますか?

このコードは、最終的には完全に自動化する必要のあるスクリプトになります。

どんな助けでも大歓迎です。

11
Tim

OK。いくつかの調査とテストの後、私は問題を理解しました。 UACとファイアウォールを無効にした後、スクリプトがまだ機能しないので、もう少し掘り下げてみると、主な問題は、invoke-commandがコマンドを実行する方法であることがわかりました。スクリプトを実行している人の資格情報を使用してサーバーへの認証を行い、別のアカウントを使用してアクセス許可を実行しようとするか、ユーザーの特権を下げて特定のコマンドを実行できないようにします。

Invokeコマンドに-Credentialsスイッチを追加しましたが、すべてが正常に機能しています。以下の修正されたコードサンプル:

$user = New-Object Management.Automation.PSCredential("$UserName", $securePassword)
invoke-command -ComputerName $ComputerName -Credential $user -ScriptBlock ` 
{ 
    cd C:\Windows\System32\inetsrv\;  
    ./appcmd.exe ADD vdir /app.name:<SiteName>/ /path:/<VDir Name> /physicalPath:<Path to files> 
} 
10
Tim

This は、リモートマシンのローカル管理者であることを確認する必要があることを示しているようです(ただし、これは特にWMI用です)。 this によると、レジストリキーを変更して、管理者のリモートログオンへのUACの適用を停止できます(LocalAccountTokenFilterPolicyを検索してください)。管理者アカウントでPowerShell/WMIをリモートで使用する場合は、UACを無効にしないでください。トークンをフィルター処理しないでください。

0
tyranid