【问题标题】:Cannot Start Service when launching installer with script from remote Powershell runspace从远程 Powershell 运行空间使用脚本启动安装程序时无法启动服务
【发布时间】:2011-04-19 11:11:09
【问题描述】:

我正在使用带有远程运行空间的 powershell 在远程机器上启动安装程序:

隐藏了一些代码,但你明白了...

我在 C# 中创建我的 PSCredential:

PSCredential pwd = new PSCredential(cred.UserName,PowerShellEngine.GenerateSecurePassword(cred.Password)); ConnectionInfo = 新的 WSManConnectionInfo( false, cred.HostName, 5985, "/wsman","http://schemas.microsoft.com/powershell/Microsoft.PowerShell",pwd); ConnectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default;

创建运行空间,并执行脚本

        //Load the script
        string script = System.IO.File.ReadAllText(scriptFileName);

        using (Runspace runspace = CreateRunSpace())
        {
            runspace.Open();
            Pipeline pipeline = runspace.CreatePipeline();
            pipeline.Commands.AddScript(script);

            if (parameters != null)
            {
                foreach (KeyValuePair<string, string> parm in parameters)
                {
                    pipeline.Commands[0].Parameters.Add(parm.Key, parm.Value);
                }
            }

            pipeline.Commands.Add("out-default");
            pipeline.Invoke();
        }

脚本....(重要的部分)

$installStatement = [System.Diagnostics.Process]::Start($App, $Switches) $installStatement.WaitForExit() "进程退出代码:$LastExitCode"

这个过程开始很好..结束了:

MSI (s) (3C:18) [21:06:18:923]:产品:xxxx -- 错误 1920。服务 xxxx 无法启动。验证您是否有足够的权限来启动系统服务。

我已验证该进程以本地管理员身份运行,在命令提示符下运行良好,使用的是 PSExec。我认为这一定与运行空间本身的 WSMAN 权限或安全性有关?

是否需要设置策略或其他内容以允许 powershell 运行空间能够在安装程序中启动服务?

谢谢,加文

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    似乎 WinRM 在 NETWORK SERVICE 帐户下运行,该帐户可能没有启动/停止 Windows 服务的权限...

    我无法将 Windows 远程管理更改为作为本地系统运行,因为其他服务(HTTP、RPCSS)依赖于它并且显然在同一进程下运行)

    有没有办法授予 NETWORK Service 启动/停止服务的能力?

    【讨论】:

      【解决方案2】:

      WinRM 服务应该在网络服务下运行。它会冒充您运行脚本时设置的任何人。您能否检查您是否已应用您创建的凭据并且该用户(来自凭据)能够启动服务?只需以该用户身份登录并尝试启动一些。

      你也可以简化一些东西。用代码编写 Test.ps1 以启动服务并运行此代码:

      $pass = ConvertTo-SecureString "password" -AsPlainText -Force
      $credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist "domain\username", $pass 
      
      
      Invoke-Command -ComputerName "remoteMachine" -FilePath "Test.ps1" -Credential $credentials -ArgumentList $parameters  
      

      如果所有设置都正确,您应该启动您的服务。

      顺便说一句,在我看来,您正在以一种非常复杂的方式完成相对简单的任务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        相关资源
        最近更新 更多