16

WsManConnectionInfo/を介してリモートコンピューターで PowerShell スクリプトを定期的に実行する Windows サービスがありRunspaceFactoryます (この記事の手順に従ってください: C# を使用して PowerShell でコマンドをリモートで実行する):

var connectionInfo = new WSManConnectionInfo(false, server, 5985, "/wsman",
                                             "http://schemas.microsoft.com/powershell/Microsoft.PowerShell",
                                             cred)
                        {
                            OperationTimeout = 4*60*1000,
                            OpenTimeout = 1*60*1000
                        };
using (var runSpace = RunspaceFactory.CreateRunspace(connectionInfo))
{
    runSpace.Open();
    using (var p = runSpace.CreatePipeline())
    {
        p.Commands.AddScript(script);
        var output = p.Invoke();
        ...
    }
}

ここで、Windows サービス自体を管理者アカウントで実行すると、すべて問題ありません。しかし、LocalSystem アカウントでサービスを実行すると、次の例外が発生します。

System.Management.Automation.Remoting.PSRemotingTransportException:
    Connecting to remote server NOSRVDEV02 failed with the following error message :
        WinRM cannot process the request. The following error with
        errorcode 0x8009030d occurred while using Negotiate authentication:
        A specified logon session does not exist. It may already have been terminated.

    Possible causes are:
        -The user name or password specified are invalid.
        -Kerberos is used when no authentication method and no user name are specified.
        -Kerberos accepts domain user names, but not local user names.
        -The Service Principal Name (SPN) for the remote computer name and port does not exist.
        -The client and remote computers are in different domains and there is no trust between the two domains.

    After checking for the above issues, try the following:
        -Check the Event Viewer for events related to authentication.
        -Change the authentication method; add the destination computer to the WinRM TrustedHosts configuration setting or use HTTPS transport.
         Note that computers in the TrustedHosts list might not be authenticated.
        -For more information about WinRM configuration, run the following command: winrm help config. For more information, see the about_Remote_Troubleshooting Help topic.

    at System.Management.Automation.Runspaces.AsyncResult.EndInvoke()
    at System.Management.Automation.Runspaces.Internal.RunspacePoolInternal.EndOpen(IAsyncResult asyncResult)
    at System.Management.Automation.RemoteRunspace.Open()
    ...

注: これは資格情報とは関係ありませんWSManConnectionInfo。サービス プロパティの [ログオン] タブのアカウント設定のみです。

サービスに管理者権限を与えたくありません。LocalSystem ユーザーがログインに失敗する理由はありますか?

追加情報:

  • リモート コンピューターはドメインのメンバーではありません。
  • IP アドレスとホスト名の両方で接続しようとしました (両方ともローカル コンピューターの にリストされていますTrustedHosts)。

編集:さらに詳しい情報(コメントの要約):

  • ローカル コンピューター: Windows 7 Ultimate 64 ビット (Windows 8 ボックス上の仮想マシン)。
  • リモート コンピューター: Windows Server 2008R2 Datacenter 64 ビット。
  • サービス ユーザー アカウントを変更したくない主な理由は、これが多くのクライアント (顧客) に既に展開されている古いサービスの更新であるためです。
  • このサービスは、ローカル コンピューターの Windows レジストリとファイル システムにもアクセスするため、ユーザー アカウントをNetworkService のようなより制限されたものに設定すると、別のワームの缶が開くだけです。
4

1 に答える 1

34

これに対するかなり驚くべき解決策:PSCredentialオブジェクト ( ) 内のユーザー名には、「 remoteusername 」だけでなく、 「 MYREMOTESERVERNAME\remoteusernamecred 」など、ドメインのないリモート コンピューターの名前をプレフィックスとして付ける必要がありました。

ただし、LocalSystemアカウントに接続する場合にのみプレフィックスが必要な理由はわかりません...

于 2013-11-14T16:27:06.300 に答える