如何根据远程服务器上的字符串数组中列出的确切特定服务名称获取特定服务?
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服务,但仍然显示:
列表中必需的服务之一,DNS甚至没有显示:
注意: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
答案 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
请您检查一下并告知我们吗?