无法在远程计算机上使用Get-Service -ComputerName

时间:2012-05-24 20:36:18

标签: windows powershell powershell-v2.0 virtualbox

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

我在我的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连接它。

5 个答案:

答案 0 :(得分: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.exePSExec.exe等命令与远程计算机建立会话时,可以使用它们。

您正在尝试使用其中一个并且您的凭据(-cred参数)存在问题,因为您的令牌凭据无法用于建立与远程计算机的管理会话。

PowerShell远程处理子系统:

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

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

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

有用的链接:Layman’s guide to PowerShell 2.0 remoting


测试一下:

$sess = New-PSSession -ComputerName myServer-Credential (Get-Credential)
Invoke-Command -Session $sess -ScriptBlock {get-service}
...
Remove-PSSession -Session $sess

答案 1 :(得分:2)

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

我找到了一个名为&#39; usser&#39;的无特权用户。谁想要PowerShell(v2)从客户端A远程连接到服务器B.

步骤:

  1. 在Targetserver B上启用-psremoting 作为管理员
  2. 在Targetserver B上以管理员身份设置-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
  3. 添加&#34; usser&#34;享有完全特权
  4. 现在出现令人兴奋的部分:

    1. sc sdshow scmanager 在Targetserver B上作为管理员
    2. 复制SDDL输出
    3. sc sdset scmanager(fe:)&#34; 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)&#34; ,在输出中你必须填写此部分之后 (A ;; CCLCRPWPRC ;;; SY) this =(A ;; KA ;;; SID < / em>的)
    4. SID 当然代表无特权&#34; usser&#34; -user
    5. 的SID
    6. 当一切都很好的时候,它会像这样:

      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)

    7. 希望你能享受那个小而复杂的解决方法。

答案 2 :(得分:1)

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

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

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

msgoodies: Using a PS Session without having Administrative Permissions

答案 3 :(得分:0)

我知道这不是这个问题的理想答案,但我遇到了类似的问题,试图使用PowerShell与Windows 7盒子交谈。事实证明,WMI尚未安装Win7附带的原生PSv2。

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

答案 4 :(得分:0)

立足于@scusi marcus的精彩回答:

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

步骤:

  1. 从目标服务器B上的提升的PowerShell提示符运行enable-psremoting。接受多个Y / N对话框确认,或者使用-force开关运行。
  2. 在与步骤1相同的提示提示下, Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
  3. 在出现的对话框中,添加“user1”。除非您计划远程操作服务,否则读取权限应该足够,在这种情况下,您将需要完全控制
  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)
  5.   

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

    1. 确定弱势用户帐户的SID(在我们的例子中,“user1”)。 (提示:尝试wmic useraccount where name='user1' get sid
    2. 将以下文本插入我们在步骤5中复制的输出中:(A;;KA;;;*SID*)其中* SID *是在步骤5中确定的用户的SID。将其插入S:部分之前的某个位置在步骤4中检索到的SDDL字符串。所以现在你应该有一个字符串看起来像这样: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)
    4. 您现在应该可以远程访问远程服务器上的服务控制管理器,同时以“user1”身份登录到客户端计算机A.

      在客户端计算机A上,您可能会发现在运行Get-Service –ComputerName remoteserver时并未列出所有服务。对于您需要远程访问但在客户端计算机A上的Get-Service输出中未列出的特定服务,您可能需要重复上述过程(从步骤4开始)。例如,如果 sqlserveragent 服务未列出(但您知道它存在于目标服务器上),您将再次登录到目标服务器B并执行sc sdshow,但这次不适用于 scmanager 但是对于 sqlserveragent 服务,所以sc sdshow sqlserveragent。您将再次收到一些需要像上面那样操作的SDDL输出。在这一点上,可能值得更多地了解SDDL(谷歌它 - 这link对我有帮助),主要的警告来监视D:和{ {1}}部分SDDL字符串,并确保您没有弄乱S:部分。