使用同一域上的计算机上的远程本地帐户进行PowerShell远程处理

时间:2014-10-23 15:49:32

标签: powershell powershell-remoting

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

我无法使用远程本地帐户进行身份验证,而且我的所有Google搜索都没有提供任何解决方案。

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

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相同的问题。

  3. 注意:我们是在跨国公司的一个分支机构工作的本地IT小组,我们无法访问GPO,因此我们没有任何简单的方法将证书推送到我们的工作站。此外,我们分支机构内的每个组都隐藏在自己的VLAN中。

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

3 个答案:

答案 0 :(得分:2)

实际上并不难。

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

您需要使用https或可信主机。不是两个。

更新可信主机(覆盖可能存在的内容): winrm s winrm/config/client '@{TrustedHosts="ServerName"}'因此您可能希望执行一些字符串操作以添加到任何现有主机。

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

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

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

答案 1 :(得分:0)

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

约束端点

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

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

这不需要HTTPS或TrustedHosts。

我之前已经完成了这项工作,但它确实有效,我不确定您是否可以使用RunAs用户的本地管理员。

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

参考

答案 2 :(得分:0)

我们为自己的某个工具使用自定义凭据,而不是在PowerShell中使用自定义凭据,我们使用NetOnly凭据启动新流程。

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