【问题标题】:PowerShell remoting using a remote local account on a computer on the same domain在同一域的计算机上使用远程本地帐户进行 PowerShell 远程处理
【发布时间】:2016-10-13 08:47:12
【问题描述】:

我用 C# 制作了一个应用程序,它使用 powershell 远程处理远程更新我们域中计算机的主机文件。它工作得很好,但我们公司的入门级 IT 支持职位没有他们的域帐户属于我们工作站的管理员组。但是,他们可以使用本地管理员帐户。我正在尝试添加“使用其他帐户连接”功能,但很快遇到了一些障碍。除了一个,我已经修复了所有这些:

我无法使用远程本地帐户对其进行身份验证,并且我所有的谷歌搜索都没有产生任何解决方案。

这是我用来更新主机文件的代码:

psInstance.AddScript("Invoke-Command -ComputerName " + computerName + " -ScriptBlock { \"" + 
    hostsTextBox.Text.Replace("\"", "`\"") + "\" | Out-File c:\\windows\\system32\\drivers\\etc\\hosts }" + 
    (differentCredentialsCheckbox.Checked ? "-Credential \"" + computerName + "\\\" -Authentication Negotiate " : ""));

当使用不同的凭据时,它会失败并显示以下消息:

[COMPUTERNAME] Connecting to remote server COMPUTERNAME failed with the following
error message : WinRM cannot process the request. The following error with error code
0x8009030e occurred while using Negotiate authentication: A specified logon session     
does not exist. It may already have been terminated.  This can occur if the provided
credentials are not valid on the target server, or if the server identity could not    
be verified. If you trust the server identity, add the server name to the
TrustedHosts list, and then retry the request. Use winrm.cmd to view or edit the
TrustedHosts list. Note that computers in the TrustedHosts list might not be
authenticated. For more information about how to edit the TrustedHosts list, run the
following command: winrm help config. For more information, see the
about_Remote_Troubleshooting Help topic.
    + CategoryInfo          : OpenError: (COMPUTERNAME:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : 1312,PSSessionStateBroken

现在,如果我理解正确,则仅在以下情况下使用远程本地帐户才有效:

  1. 连接是使用 HTTPS 建立的,但这会带来一系列问题。需要为每台计算机创建一个证书,该工具旨在使用并安装在我们的 500 多个工作站上。此外,如果技术人员获得了一台新计算机,则需要重新开始该过程(这种情况不应该经常发生,但可能性不为零)

  2. 计算机使用 TrustedHosts 相互信任,但这也存在与 #1 相同的问题。

注意:我们是在一家跨国公司的分支机构之一工作的本地 IT 团队,我们无法访问 GPO,因此我们没有任何简单的方法可以将证书推送到我们的工作站.此外,我们分支机构中的每个组都隔离在自己的 VLAN 上。

有没有人能想出一种方法来实现我想要做的事情?

【问题讨论】:

  • 您是否考虑过设置一个在管理员帐户下运行的受限委托会话,并让他们通过它运行您的应用程序?

标签: powershell powershell-remoting


【解决方案1】:

其实没那么难。

我认为您读错了手册 ;-) 我可以通过将远程服务器添加到客户端服务器上的受信任主机(启动会话的主机)来使类似的案例正常工作。

您需要 https 或受信任的主机。两者都不是。

要更新受信任的主机(覆盖其中可能存在的任何内容): winrm s winrm/config/client '@{TrustedHosts="ServerName"}' 所以你可能想做一些字符串操作来添加到任何现有的主机。

如果您在该命令中遇到错误,请先确保 winrm quickconfig

我的邀请很简单: Invoke-Command -ComputerName $rmServerName -Credential $rmCred -ScriptBlock $block -ArgumentList $destName -ErrorAction:Stop

这适用于没有 SSL 设置的跨域。

【讨论】:

    【解决方案2】:

    关于需要 HTTPS 和 TrustedHosts 是正确的。您可能不知道的一件事是计算机可能已经拥有证书。如果在域中设置了企业 CA,则计算机可能已设置为自动注册。

    受限端点

    其他可行的方法是为此任务创建一个特殊的 Powershell 端点,并为其提供本地用户的 RunAsCredential。我不是 100% 确定它是否适用于本地用户,但我认为它可以。

    如果您不熟悉,步骤是使用New-PSSessionConfigurationFile 创建会话定义,然后使用RegisterPSSessionConfiguration 将该文件注册到本地计算机上。在后一个调用中,您可以提供 -RunAsCredential 并且 powershell 会话将在这些凭据下运行。您可以将访问权限委托给非管理(域)用户来访问此端点(使用 Register-PSSSessionConfiguration-ShowSecurityDescriptorUI 参数来简化此操作)。

    这不需要 HTTPS 也不需要 TrustedHosts。

    我以前做过这个,它确实有效,我只是不确定你是否可以为 RunAs 用户使用本地管理员。

    如果没有,您可以使用具有本地管理员权限的域帐户;帮助台人员不会直接以该用户身份进行身份验证,因此他们不需要其凭据。

    参考文献

    【讨论】:

    • 感谢您的详细回答。很遗憾,我们没有证书,所以我会考虑您的第二个建议。
    【解决方案3】:

    我们为我们的一种工具使用自定义凭据,而不是在 PowerShell 中使用自定义凭据,我们使用 NetOnly 凭据启动了一个新进程。

    我们在 C# 中执行此操作,但您也可以使用 runas /netonly /user:localadmin 运行应用程序,系统会提示您输入密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2017-03-08
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多