winrmおよびMicrosoft.Update.Sessionを使用してリモートでサーバーにパッチを適用する際の問題


10

Windows 2003、2008、2008r2サーバーのネットワークがあります。「Microsoft.Update」comオブジェクトを使用してローカルマシンにパッチを当てるために書いたPowerShellスクリプトがあります。(Windows Update PowerShell Remotingに似てい ます。)私のスクリプトはローカルでうまく機能しますが、管理するサーバーの数がかなり多いため、リモートでその機能を使用したいと思います。その場合は落ちます(解決されなかった他の投稿と同様)。

ただし、失敗を特定のクラスの2つのメソッドに絞り込むことができました。

(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()

これらを管理者としてローカルでPowerShellで実行しても、問題はありません。invoke-command(またはenter-session、またはwinrs)を使用しようとすると、次のエラーが発生します。(これはlocalhostでテストしていますが、どのホストでも実行できます。credsspやkerberosなどのさまざまな認証方法も試しました。)

PS C:\> Invoke-Command -ComputerName localhost -ScriptBlock { (New-Object -ComObject "microsoft.update.session").createUpdateDownloader()}
Exception calling "CreateUpdateDownloader" with "0" argument(s): "Access is denied. (Exception from HRESULT: 0x80070005
 (E_ACCESSDENIED))"
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

これはブログでバグとして言及されているのを見たことがありますが、その主張に対するバックアップはありません。2つの回避策があり、どちらも私を幸せにしません。

  • psexecを使用して、システムユーザーとしてコマンドを実行します。PSExecは、信頼できないことが判明したため、使用しないようにしています。純粋なpowershellソリューションも必要です。
  • スケジュールされたタスクを作成し、システムユーザーとしてスクリプトを実行するように指示します。(この投稿を介して)これは厄介なだけでなく、更新結果がありません。ファイルにログを記録するか、データベースなどを更新する必要があります。

多くの人が直面している問題のように思えるので、リモートでホスト上で更新を実行する他の方法を利用できます。

メッセージを説明しているが、理由や回避策は説明していないドキュメントが見つかりました。

戻り値成功した場合、S_OKを返します。それ以外の場合は、COMまたはWindowsエラーコードを返します。

This method can also return the following error codes.
Return code   Description
E_INVALIDARGA parameter value is invalid. 
E_ACCESSDENIED    This method cannot be called from a remote computer.

リモートコンピューターを使用していることはどのようにしてわかりますか?


これは、WSUSインスタンスを立ち上げてそのルートをたどるよりもはるかに複雑に見えます。そのルートを検討しましたか?
Driftpeasant

サーバーがいつ買収されるかを正確に制御することはできず、WSUSだけでサーバーを確実に復旧させることはできません。私たちはアップデート自体にそれを活用します。オンデマンドで実行できるようにトリガーできるかどうかに興味があります。
2011

Server 2012でPowerShell Web Accessを使用して同じ問題を抱えていますが、裏側ではPowerShellリモート処理も使用しています。同じエラー。
Peter Hahndorf、

1
可能な回答はこちらserverfault.com/a/474031/23300
Nic

@reconbot私は非常に古い質問を知っていますが、私も問題に直面しています。修正または代替方法はありましたか?
マシンの計算

回答:



0

このようなコマンドは、リモートマシン上で特権を使用して実行する必要があり、ドメイン管理ユーザーまたはリモートマシン上の管理者として実行する必要があります。

あなたのケースが最初のケースである場合、私は助けがありませんが、あなたはローカル管理者であり、リモートではなく、get-credentialこのように使用します。

$cred = get-credential

Invoke-Command -ComputerName localhost -credential $cred -scriptblock {}

代替のより直接的な形式はInvoke-Command、資格情報を要求します。

Invoke-Command -scriptblock {$ENV:username} -Credential ""

管理者アカウントの資格情報で実行していますが、エラーには「このメソッドはリモートコンピューターから呼び出すことはできません」と指定されています。
'26年

0

リモートサーバーでJEAエンドポイントをローカル仮想アカウントとして実行するように設定することで、これを機能させることができました。

https://docs.microsoft.com/en-us/powershell/jea/session-configurationsから:

ローカル仮想アカウント

このJEAエンドポイントでサポートされている役割がすべてローカルマシンの管理に使用され、ローカル管理者アカウントでコマンドを正常に実行できる場合は、ローカル仮想アカウントを使用するようにJEAを構成する必要があります。仮想アカウントは、特定のユーザーに固有の一時的なアカウントであり、PowerShellセッションの期間だけ持続します。メンバーサーバーまたはワークステーションでは、仮想アカウントはローカルコンピューターのAdministratorsグループに属し、ほとんどのシステムリソースにアクセスできます。Active Directoryドメインコントローラでは、仮想アカウントはドメインのDomain Adminsグループに属しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.