Запуск скрипта powershell в разных ОС

Я пытаюсь запустить указанную ниже команду на сервере 2012, и она извлекает пользователей из группы пользователей «Администраторы». Но в Server 2008R2 он загружается из всего домена.

Get-WmiObject -Class Win32_GroupUser `
| where{$_.GroupComponent -like "*Administrators*"} `
|foreach { 
$data = $_.PartComponent -split "\," 
$data[1].Remove(0,5).Replace('"','') 
} 

person V T    schedule 12.06.2017    source источник


Ответы (1)


Как вы уже догадались, проблема в том, что win2008R2 имеет только PS 2.0.x. Я думаю, что эта команда where{$_.GroupComponent -like "*Administrators*"} недоступна в этой версии, поэтому она запрашивает всю AD в качестве запасного варианта (это предположение).

Из вашего описания я не понял, хотите ли вы запросить локальный сервер или домен, поэтому я введу оба (все работают на win2008R2 (версия PS 2.0.50727)):

Для запроса локальных администраторов и

#get servers by AD OU
If (!(Get-Module ActiveDirectory)) {
    Import-Module ActiveDirectory
}
function get-localadmins{
  [cmdletbinding()]
  Param(
  [string]$server
  )
  $group = get-wmiobject win32_group -ComputerName $server -Filter "LocalAccount=True AND SID='S-1-5-32-544'"
  $query = "GroupComponent = `"Win32_Group.Domain='$($group.domain)'`,Name='$($group.name)'`""
  $list = Get-WmiObject win32_groupuser -ComputerName $server -Filter $query
  $list | %{$_.PartComponent} | % {$_.substring($_.lastindexof("Domain=") + 7).replace("`",Name=`"","\")}
}

get-localadmins 'your_server_name'

Если ваша цель — запросить всю AD, вы можете использовать:

В Windows 2008 R2 SP1 это может привести к ошибке: System.DirectoryServices.AccountManagement.PrincipalOperationException: Ошибка (1301) при перечислении групп. Не удалось разрешить SID группы.

Вам необходимо установить исправление от Microsoft по адресу: https://support.microsoft.com/en-us/help/2830145/sid-s-1-18-1-and-sid-s-1.-18-2-неможет-быть-отображен-на-компьютерах-на-основе-Windows-в-доменной-среде?wa=wsignin1.0%3Fwa%3Dwsignin1.0

Следующий код был взят отсюда: https://stackoverflow.com/a/8057025/6059896 (все кредиты автора) - изменил только имена переменных на фиговый мой стиль кодирования.

$Recurse = $true

Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$context_type = [System.DirectoryServices.AccountManagement.ContextType]::Domain
$group_principal_identity=[System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($ct,'Administrators')
$group.GetMembers($Recurse)
person tukan    schedule 21.06.2017