2016-01-13 191 views
0

对于错误提前道歉。我还在学习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格式,但至少,我可以得到一些信息,其中服务器的服务故障重启未进行相应设置

预先感谢

干杯

ģ

回答

0

由于Invoke-Command不支持-WhatIf开关,最好的办法是在控制台上回显服务器名称以查看导致故障的服务器名称。在调试语句中,服务器名称用单引号'括起来,例如,多余的空格更易于查看。像这样,

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

您也可以尝试写Invoke-Command语句到控制台和复制粘贴那些到另一个PowerShell会话,看看哪些,如果有的话,是失败的一个。

对于什么是值得的,你似乎使用变量$Server$server(注意大写/小写字母的差异)。尽管变量名在Powershell中不区分大小写,但可能由简单的拼写错误导致未初始化的变量。为防止出现这种情况,请使用Set-StrictMode。这将导致Powershell抱怨未初始化的变量,这通常是由错误的变量名造成的。

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}} 
     }