Назад | Перейти на главную страницу

Получение членов локальной группы пользователей - Powershell

$Output = 'C:\temp\Result.txt'
$Servers = Get-Content 'C:\temp\ServerNames.txt'
$ScriptBlock = {

$Groups = Get-WmiObject Win32_GroupUser -ComputerName $Servers 
$LocalAdmins = $Groups | Where GroupComponent –like '*"Administrators"'

$LocalAdmins |% {  
$_.partcomponent –match ".+Domain\=(.+)\,Name\=(.+)$" > $nul  
$matches[1].trim('"') + "\" + $matches[2].trim('"')
}
}
foreach ($ServerNames in $Servers) {
"Local Admin group members in $ServerNames" | Out-File $Output -Append
Invoke-command -ScriptBlock $ScriptBlock -ComputerName $ServerNames | Out-  File $Output -Append
}

Я использую вышеупомянутый скрипт, чтобы заставить членов группы локальных администраторов работать на нескольких серверах, я получаю сообщение об ошибке -

Невозможно проверить аргумент параметра ComputerName. Аргумент равен нулю или пуст. Укажите аргумент, который не может быть пустым или пустым, а затем повторите команду. + CategoryInfo: InvalidData: (:) [Get-WmiObject], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationError, Microsoft.PowerShell.Commands.GetWmiObjectCommand + PSComputerName: Computer

Не могли бы вы помочь мне исправить это ...?

Имена серверов в файле ServerNames.txt находятся в этом формате, указанном ниже -

ServerNames.txt

$Output = 'C:\temp\Result.txt'
$Servers= Get-Content 'C:\temp\ServerNames.txt'
$ScriptBlock = {
    $Groups = Get-WmiObject Win32_GroupUser -ComputerName $Using:ServerName
    $LocalAdmins = $Groups | Where GroupComponent –like '*"Administrators"'
    $LocalAdmins | ForEach-Object {  
        If($_.partcomponent –match ".+Domain\=(.+)\,Name\=(.+)$"){  
            $matches[1].trim('"') + "\" + $matches[2].trim('"')
        }
    }
}
ForEach ($ServerName in $Servers) {
    "Local Admin group members in $ServerName" | Out-File $Output -Append
    Invoke-command -ScriptBlock $ScriptBlock -ComputerName $ServerName | Out-File $Output -Append
}

Но ИМО это можно было бы немного упростить без ненужных варов

$Output = 'C:\temp\Result.txt'
$Servers= Get-Content 'C:\temp\ServerNames.txt'
$ScriptBlock = {
    Get-WmiObject Win32_GroupUser -ComputerName $Using:ServerName |
    Where GroupComponent –like '*"Administrators"'|
    ForEach-Object {  
        If($_.partcomponent –match ".+Domain\=(.+)\,Name\=(.+)$"){  
            $matches[1].trim('"') + "\" + $matches[2].trim('"')
        }
    }
}
ForEach ($ServerName in $Servers) {
    "Local Admin group members in $ServerName" | Out-File $Output -Append
    Invoke-command -ScriptBlock $ScriptBlock -ComputerName $ServerName | Out-File $Output -Append
}