6

我有一个带有虚拟框的 Windows 2003 框设置,我无法使用 powershell 来使用它。

我在我的 Windows 7 机器上试试这个

Get-Service –ComputerName myserver

我回来

Get-Service : Cannot open Service Control Manager on computer 'myserver'. This operation might require other privileges.
At Script1.ps1:2 char:4
+ gsv <<<<  -cn myserver
    + CategoryInfo          : NotSpecified: (:) [Get-Service], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShell.Commands.GetServiceCommand

在四处搜索时,我发现我应该尝试使用Enable-PSRemoting.

我这样做了,现在当我尝试使用它时,我得到了

WinRM 已设置为在此计算机上接收请求。WinRM 已经设置为在这台机器上进行远程管理。

但是我仍然遇到同样的错误。这是因为我使用的是虚拟机吗?我将虚拟操作系统设置在我的域上,我什至可以使用我的 AD 帐户凭据登录。

我可以从中获取其他信息。

所以这并不是我不能用 powershell 连接到它。

4

5 回答 5

7

使用 PowerShell V2,您有两种远程命令方法。

带有内置远程处理的命令:

PowerShell v2 中的一小部分命令有一个-ComputerName参数,允许您指定要访问的目标机器。

Get-Process
Get-Service
Set-Service

Clear-EventLog
Get-Counter
Get-EventLog
Show-EventLog
Limit-EventLog
New-EventLog
Remove-EventLog
Write-EventLog

Restart-Computer
Stop-Computer

Get-HotFix

这些命令自己进行远程处理,或者是因为底层基础设施已经支持远程处理,或者它们解决了对系统管理特别重要的场景。它们建立在 DCOM 的顶部,从访问的角度来看,当您可以使用类似NET.exe或之类的命令与远程计算机建立会话时,您可以使用它们PSExec.exe

您正在尝试使用其中一个,但凭证(-cred参数)有问题,因为您的令牌凭证不能用于建立与远程计算机的管理会话。

PowerShell 远程处理子系统:

在您可以使用 PowerShell 远程访问远程计算机之前,必须明确启用该计算机上的远程服务。您可以使用Enable-PSRemotingcmdlet 执行此操作。如果您在工作组中工作,您还需要启用服务器以使用此命令在您的客户端计算机上输入(在您的客户端计算机上以管理员身份):

Set-Item WSMan:\localhost\Client\TrustedHosts *

然后,您将使用New-PSSessionCmdlet(带有-computername-credentials)来创建会话对象。然后Invoke-Command(使用-sessionand -scriptblock)cmdlet 允许您远程调用另一台计算机上的脚本块。这是远程处理中大多数功能的基本元素。您还可以使用 Enter-PSSession 与服务器建立交互式(类似于 SSL)的 PowerShell 命令行。

有用的链接:Layman 的 PowerShell 2.0 远程处理指南


测试这个:

$sess = New-PSSession -ComputerName myServer-Credential (Get-Credential)
Invoke-Command -Session $sess -ScriptBlock {get-service}
...
Remove-PSSession -Session $sess
于 2012-05-25T05:20:04.890 回答
3

如果它仍然很重要,这是我的解决方法:

我有一个名为“usser”的非特权用户,他希望将 powershell(v2) 从客户端 A 远程处理到服务器 B。

脚步:

  1. 以管理员身份在 Targetserver B 上启用-psremoting
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI在 Targetserver B 上作为管理员
  3. 添加具有完全权限的“用户”

现在是激动人心的部分:

  1. 以管理员身份在 Targetserver B 上的sc sdshow scmanager

  2. 复制 SDDL 输出

  3. sc sdset scmanager (fe:)"D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY) (A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)" ,在输出中,您必须在此部分之后填写(A;; CCLCRPWPRC;;;SY)这 = (A;;KA;;; SID )

  4. SID当然代表非​​特权“用户”用户的 SID

  5. 当一切正常时,它会看起来像这样:

    D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;; S-1-5-21-4233383628-1788409597-1873130553-1161)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)

希望您会喜欢这种小而复杂的解决方法。

于 2015-08-24T13:13:51.733 回答
1

查看和操作服务需要目标机器的管理权限。

我能够通过尝试以Get-Service -ComputerName MyServer对相关服务器没有管理权限的用户帐户登录时运行来复制您的错误消息。

您可以通过授予目标服务器上的工作站用户帐户管理权限或通过在服务器上创建本地组并向该组的成员授予调用权限来解决此问题。如果你想做后者,请参阅下面的文章。

msgoodies:在没有管理权限的情况下使用 PS 会话

于 2012-06-01T21:54:30.987 回答
1

以@scusi marcus 的精彩回答为基础:

假设我有一个名为“user1”的非特权/受限用户,他希望将 powershell(v2+) 从客户端机器 A 远程处理到目标服务器 B。

脚步:

  1. 从目标服务器 B 上提升的 powershell 提示符,运行enable-psremoting. 接受几个 Y/N 对话框确认或使用-forceswitch 运行。
  2. 在与步骤 1 相同的提升提示中,Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
  3. 在出现的对话框中,添加“user1”。除非您计划远程操作服务,否则读取权限应该足够了,在这种情况下,您将需要Full Control
  4. 在目标服务器 B 上,从提升的(非 powershell)提示符或以管理员身份运行sc sdshow scmanager. 复制 SDDL 输出。可能看起来像这样:D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)

更新:如果我们将受限用户添加到目标计算机的远程管理用户组,我们可以添加(A;;LCRPWPDTLO;;;RM)D:上述 SDDL 字符串的部分,并跳过下面的步骤 5 和 6。

  1. 确定低权限用户帐户的 SID(在我们的示例中为“user1”)。(提示:试试wmic useraccount where name='user1' get sid
  2. 将以下文本插入到我们在第 5 步中复制的输出中:其中 *SID* 是在第 5 步中确定的用户的 SID。将其插入到第 4 步中检索到的 SDDL 字符串部分(A;;KA;;;*SID*)之前的某个位置。所以现在您应该S:有一个看起来像这样的字符串:D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;S-1-5-21-4233383628-1788409597-1873130553-1161)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
  3. 在目标服务器 B 上,运行sc sdset scmanager我们新修改的 SDDL 字符串。所以整个命令看起来像这样: sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;S-1-5-21-4233383628-1788409597-1873130553-1161)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)

您现在应该能够在以“user1”身份登录到客户端计算机 A 时远程访问远程服务器上的服务控制管理器。

在客户端机器 A 上,您可能会发现运行时Get-Service –ComputerName remoteserver并未列出所有服务。您可能需要对需要远程访问但未Get-Service在客户端计算机 A 上的输出中列出的特定服务重复上述过程(从步骤 4 开始)。例如,如果未列出sqlserveragent服务(但您知道它存在于目标服务器上),您将再次登录到目标服务器 B 并执行sc sdshow,但这次不是针对scmanager而是针对sqlserveragent服务,所以sc sdshow sqlserveragent. 您将再次收到一些需要按上述操作的 SDDL 输出。在这一点上,可能值得进一步了解 SDDL(谷歌它 - 这个链接对我有帮助),主要注意事项是注意 SDDL 字符串的D:S:部分,并确保您没有弄乱该S:部分。

于 2018-04-17T22:26:33.003 回答
0

我知道这不是这个问题的理想答案,但我在尝试使用 PowerShell 与 Windows 7 机器对话时遇到了类似的问题。事实证明,WMI 没有安装在 Win7 附带的本机 PSv2 中。

一旦我将 v3 作为 WMI 3.0 包的一部分安装,问题就自行解决了。我建议确保所有相关的 WMI 服务都在您的服务器上运行。除非您有冲突,否则我还建议升级到 WMI 3.0。

于 2013-11-10T23:45:37.093 回答