从ArrayList获取针对远程服务器的服务,返回错误结果?

时间:2020-09-23 07:53:12

标签: powershell active-directory

如何根据远程服务器上的字符串数组中列出的确切特定服务名称获取特定服务?

Status   Name               DisplayName                           
------   ----               -----------                           
Running  DFS                DFS Namespace                         
Running  DFSR               DFS Replication                       
Running  DNS                DNS Server                            
Running  EventSystem        COM+ Event System                     
Running  IsmServ            Intersite Messaging                   
Running  KDC                Kerberos Key Distribution Center      
Running  LANMANServer       Server                                
Running  LANMANWorkstation  Workstation                           
Running  Netlogon           NETLOGON                              
Running  NTDS               Active Directory Domain Services      
Running  RPCSs              Remote Procedure Call (RPC)           
Running  SAMSs              Security Accounts Manager             
Running  W32Time            Windows Time 

因为以下脚本从 $ ServiceList 变量提供的名称中返回了错误的服务。

没有提及Afd服务,但仍然显示:

There was no mention about Afd service, but it still showing?

列表中必需的服务之一,DNS甚至没有显示:

One of the required Services on the list, DNS is not even showing?

注意:Powershell ISE已作为管理员执行,并且具有Domain Admins凭据。脚本已成功执行,没有任何问题,但是结果与$ ServiceList变量内容的特定列表不符。

这是我到目前为止的脚本:

$ServiceList = @(
    'DFS'
    'DFSR'
    'DNS'
    'EventSystem'
    'IsmServ'
    'KDC'
    'LANMANServer'
    'LANMANWorkstation'
    'NETLOGON'
    'NTDS'
    'RPCSs'
    'SAMSs'
    'W32Time'
)

$input = Get-ADDomainController -Filter * | Select-Object -ExpandProperty HostName
$input | ForEach-Object `
{
    $Servers = ($_ -split '\.')[0]
    
    $Servers | ForEach-Object `
    {
        $Server = $_
        
        Write-Host "Processing $($Server) ..." -ForegroundColor Cyan
        
        if (Test-Connection -ComputerName $Server -Count 2 -Quiet)
        {
            foreach ($ServiceToCheck in $ServiceList)
            {
                Write-Host "`tChecking $($Server) - $($ServiceToCheck) ..." -ForegroundColor Yellow
                
                Try
                {
                    If ($services = Get-Service -ServiceName $ServiceToCheck -ComputerName $Server)
                    {
                        $services | Select-Object -ExpandProperty ServicesDependedOn | Select-Object StartType, Status, Name, DisplayName, Machinename, @{ N = 'Service Dependency'; E = { (Get-Service -Name $_.ServicesDependedOn -ComputerName $Server | ForEach-Object { "$($_.Name): $($_.Status)" }) -join '; ' } }
                    }
                    Else
                    {
                        "" | Select-Object @{ n = "Status"; e = { "Services not found" } },
                                           @{ n = "DisplayName"; e = { "$($_.Services)" } },
                                           @{ n = "Machinename"; e = { $Server } }
                    }
                }
                Catch
                {
                    "" | Select-Object @{ n = "Status"; e = { "Error checking services" } },
                                       @{ n = "DisplayName"; e = { "" } },
                                       @{ n = "Machinename"; e = { $Server } }
                }
                
            }
        }
        else
        {
            "" | Select-Object @{ n = "Status"; e = { "Couldn't ping server" } },
                               @{ n = "DisplayName"; e = { "" } },
                               @{ n = "Machinename"; e = { $Server } }
        }
    }
} | Out-GridView

1 个答案:

答案 0 :(得分:1)

我刚刚重写了您的代码。

我已删除变量$input,因为它是PowerShell中的Automatic variable

我还摆脱了第二个$Servers | ForEach-Object循环,并确保代码的所有部分都输出了相似的对象以在GridView中输出

$ServiceList = 'DFS','DFSR','DNS','EventSystem','IsmServ','KDC','LANMANServer',
               'LANMANWorkstation','NETLOGON','NTDS','RPCSs','SAMSs','W32Time'

Get-ADDomainController -Filter * | Select-Object -ExpandProperty HostName | ForEach-Object {
    $Server = ($_ -split '\.')[0]  # get the server name from the HostName
   
    Write-Host "Processing $($Server) ..." -ForegroundColor Cyan
    
    if (Test-Connection -ComputerName $Server -Count 2 -Quiet) {
        foreach ($ServiceToCheck in $ServiceList) {
            Write-Host "`tChecking $($Server) - $($ServiceToCheck) ..." -ForegroundColor Yellow
            
            Try {
                $svc = Get-Service -ServiceName $ServiceToCheck -ComputerName $Server -ErrorAction Stop
                if ($svc) {
                    # successfully found a service
                    # get basic info about services this service depends on (if any)
                    $dependingOn = (Get-Service -Name $_.ServicesDependedOn -ComputerName $Server | 
                                    ForEach-Object { "$($_.Name): $($_.Status)" }) -join '; '
                    $svc | Select-Object StartType, Status, Name, DisplayName, Machinename, 
                                         @{ n = 'Service Dependency'; e = { $dependingOn } }
                }
                else {
                    # service not found
                    "" | Select-Object StartType, 
                                       @{ n = "Status"; e = { "Service not found" } },
                                       @{ n = "Name"; e = { $ServiceToCheck } },
                                       DisplayName,
                                       @{ n = "Machinename"; e = { $Server } },
                                       'Service Dependency'
                }
            }
            Catch {
                # Get-Service returned an error in $_.Exception.Message
                "" | Select-Object StartType,
                                   @{ n = "Status"; e = { "Error checking services" } },
                                   @{ n = "Name"; e = { $ServiceToCheck } },
                                   DisplayName,
                                   @{ n = "Machinename"; e = { $Server } },
                                   'Service Dependency'
            }
            
        }
    }
    else {
        # server is off-line
        "" | Select-Object StartType,
                           @{ n = "Status"; e = { "Couldn't ping server" } },
                           @{ n = "Name"; e = { $ServiceToCheck } },
                           DisplayName,
                           @{ n = "Machinename"; e = { $Server } },
                           'Service Dependency'
    }
} | Out-GridView

请您检查一下并告知我们吗?

相关问题