获取服务器列表的特定服务恢复选项

时间:2016-01-13 13:00:45

标签: powershell

提前为错误道歉。我还在学习Powershell。

我正在尝试检查AD中服务器列表的特定服务恢复选项

$credential = Get-Credential
$servers = Get-ADComputer -Filter * -properties * | ?{$_.OperatingSystem -match "server"} | ft name -hidetableheaders | out-string
$Results = @()
    foreach ($Server in $Servers)
    {
      Invoke-command -cn $server -credential $credential -ScriptBlock {Get-WMIObject win32_service | 
    Where-Object {$_.description -imatch "nscli" -and $_.startmode -eq "Auto"}; foreach ($service in $services){sc.exe qfailure $service.name}}
    }

我收到以下错误

Invoke-command : One or more computer names are not valid. If you are trying to pass a URI, use the -ConnectionUri parameter, or pass URI objects
instead of strings.
At line:1 char:32
+ foreach ($Server in $Servers) {Invoke-command -cn $server -credential $credentia ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (System.String[]:String[]) [Invoke-Command], ArgumentException
+ FullyQualifiedErrorId : PSSessionInvalidComputerName,Microsoft.PowerShell.Commands.InvokeCommandCommand

如果我直接在每台服务器上运行命令,我没有任何问题。

Invoke-command -cn EXCHANGE -credential $credential -ScriptBlock {$services = Get-WMIObject win32_service | Where-Object {$_.description -imatch "nscli" -and $_.startmode -eq "Auto"}; foreach ($service in $services){sc.exe qfailure $service.name}}
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: NSClientpp
    RESET_PERIOD (in seconds)    : 0
    REBOOT_MESSAGE               :
    COMMAND_LINE                 :
    FAILURE_ACTIONS              : RESTART -- Delay = 120000 milliseconds.
                                   RESTART -- Delay = 120000 milliseconds.

因为我正在使用sc.exe,所以我不确定如何将列表输出为csv格式,但至少,我可以获得一些关于服务失败重启的服务器没有相应设置的信息

提前致谢

干杯

2 个答案:

答案 0 :(得分:0)

由于Invoke-Command不支持-WhatIf切换,最好的办法是在控制台上回显服务器名称,以查看导致失败的服务器名称。在debugging语句中,服务器名称用单引号'括起来,例如,更容易看到额外的空格。像这样,

foreach ($Server in $Servers)
{
  Write-host $("Now processing server '{0}' " -f $Server)
  Invoke-command ...
}

您还可以尝试编写Invoke-Command语句来控制并将这些语句复制粘贴到另一个Powershell会话中,以查看哪个(如果有的话)是失败的。

对于它的价值,您似乎使用变量$Server$server(注意大写/小写差异)。虽然变量名在Powershell中不区分大小写,但您可能有简单的拼写错误导致的未初始化变量。为防范此类情况,请使用Set-StrictMode。这将导致Powershell抱怨未初始化的变量,这些变量通常是由错误输入变量名称引起的。

答案 1 :(得分:0)

搞定了。应该早点回应。谢谢你们。

# Get the credential
$Credential=Get-Credential

# Collect the server list
$Servers = Get-ADComputer -Filter * -Properties operatingsystem | Where operatingsystem -match 'server'

$Results = @()    

## Check service status 
$Results = foreach ($Server in $Servers)
        {Invoke-Command -ComputerName $Server.Name –Ea 0 -Credential $Credential {Get-Service |?{$_.DisplayName –match “nscli”} }}

## Create a csv report
$Results| Sort PSComputerName | select PSComputerName, DisplayName, Name, Status |Export-Csv nsclient_service.csv -NoTypeInformation -UseCulture

# Check the recovery options for NSclient service on each Server
foreach ($Server in $Servers)
        { write-host "Checking " $Server.Name;
        Invoke-Command -ComputerName $Server.Name –Ea 0 -Credential $Credential `
              {$services = Get-WMIObject win32_service | Where-Object {$_.name -imatch "nscli" -and $_.startmode -eq "Auto"}; `
                    foreach ($service in $services){sc.exe qfailure $service.name}}
        }