web-dev-qa-db-ja.com

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

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ソリューションも必要です。
  • スケジュールされたタスクを作成し、システムユーザーとしてスクリプトを実行するように指示します。 (t 彼の投稿 経由)これは厄介なだけでなく、更新結果がありません。ファイルにログを記録するか、データベースなどを更新する必要があります。

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

一部のドキュメント が見つかりましたが、メッセージは説明されていますが、理由や回避策は説明されていません。

戻り値成功した場合、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.

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

10
reconbot

MSがWUApi経由でそれを行うことを許可していないので、あなたはそれを一致させることはできません。

詳細はここにあります: http://msdn.Microsoft.com/en-us/library/windows/desktop/aa387288(v = vs.85).aspx

これを行うには、スケジュールされたタスクを使用してみてください。

6
River

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

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

$cred = get-credential

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

別のより直接的な形式はlet Invoke-Command認証情報を要求:

Invoke-Command -scriptblock {$ENV:username} -Credential ""
0
motobói

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

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

ローカル仮想アカウント

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

0
jsmitty