0

私は、Invoke-Commandを使用してサーバー上でWindows/Microsoft Updateをリモートで呼び出すPowershellモジュールをセットアップしてから、呼び出し側のサーバーが電子メールレポートを送信できるようにします。PowershellのInvoke-Commandを使用してWindows Updateを実行中にアクセスが拒否されました

私は、ダウンローダを試してみると、私の問題が発生します。Powershellは、リモートコンピュータの権限の昇格を要求しているようです。ここで

は、私が実行して失敗しようとしているものの抜粋です:

Invoke-Command -ComputerName $Server -Credential $Credentials -ScriptBlock { 
    $UpdateSession = New-Object -ComObject "Microsoft.Update.Session" 
    Write-Progress -Activity "Updating" -Status "Checking for new updates" 
    $Criteria = "IsInstalled=0 and Type='Software'" 
    $Updates = $UpdateSession.CreateUpdateSearcher().Search($Criteria).updates 
    $Downloader = $UpdateSession.CreateUpdateDownloader() 
    $Downloader.Updates = $Updates 
} 

私は最初の4つのコマンドが正常に動作として問題は、リモートではないことを知っています。 $Credentials変数は、リモートサーバー上のローカル管理者である、事前定義された資格情報を指します。

スクリプトは第5ライン、$Downloader = $UpdateSession.CreateUpdateDownloader()になると、私はPowerShellのからこのエラーを取得する:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) 
    + CategoryInfo   : OperationStopped: (:) [], UnauthorizedAccessException 
    + FullyQualifiedErrorId : System.UnauthorizedAccessException 
    + PSComputerName  : SERVER.sidlee.inc 

まさにこれを引き起こしている可能性がありますか?

ありがとうございました!

+0

正しく覚えていれば、ほとんどのWindows UpdateとMicrosoft Installerの方法では、ローカルセッションと対話セッションが必要です。 1つの回避策は、すぐに実行するタスクスケジューラタスクを設定します。 – BenH

+0

もしそうなら、それは非常に吸うだろう、それは基本的に私が元来していたものだからだ。私はすべてを実行していた大規模なスクリプトを持っていました(Windowsの更新をトリガーし、レポートを生成し、別のサーバー経由で電子メールで送信するなど)、Powershellモジュールを介してすべてを単一のサーバーから実行したかったのです。 –

答えて

0

私はちょうど同じ壁に当たったので、Googleはあまり役に立ちませんでした。ここで私が掘り起こすことができました。

記録のために、私はかなり(Windowsのアップデートのためのリモートシステムを確認するために、カスタムPSコードを使用して)同じことをやっているが、Pythonの上にWinRMを使用して代わりにInvoke-CommandのもE_ACCESSDENIEDエラーをスローMicrosoft.Update.Searcher.Search()に捕まってしまいました。

UnauthorizedAccessExceptionは実際にPowershellとは関係ありませんが、基礎をなすAPIです。

最近のアップデート(Powershell v5?)でリモートセッションの偽装を開始したと思われるが、これは以前のWindowsバージョン(Powershell v3または2012 R2 v4のServer 2012 )

これを回避するには、PSCredentialオブジェクトで実行する前に(リモートサーバー上で)認証する必要があります。 Start-Process -Credential ...

などを用いて例えばだから

Remote Auth -> Local Auth -> Run stuff

$pass = ConvertTo-SecureString "PA$$W0RD" -AsPlainText -Force 
$creds = New-Object System.Management.Automation.PSCredential "User", $pass 
Start-Process -Credential $creds powershell -ArgumentList "-Command & { ... whatever you want to do ... }" 

これはあなたのパスワードはクリアテキストで解析されるように、セキュリティ上のリスクをもたらすので、 暗号化されていないチャネルを介してこれをしないことに注意してください!

関連する問題