Для анализа всех пользователей и групп из вывода whoami /all
должен работать приведенный ниже код.
Возвращает массив [PsCustomObjects]
со свойствами Name
, SID
и Type
(либо «Пользователь»'или' Group ').
Это позволяет вам сохранить его как файл CSV, если хотите.
$type = ''
$result = (whoami /all) | ForEach-Object {
switch -Regex ($_) {
'^User\s?Name' { $type = 'User' ; break }
'^Group\s?Name' { $type = 'Group'; break }
'^\s*$' { $type = '' ; break}
'^=+' { $width = $_ -split ' ' ; break }
default {
if ($type -eq 'User') {
$sidStart = $width[0].Length + 1
[PsCustomObject]@{
'Name' = $_.Substring(0, $width[0].Length).Trim()
'SID' = $_.Substring($sidStart, $width[1].Length).Trim()
'Type' = $type
}
}
elseif ($type -eq 'Group') {
$sidStart = $width[0].Length + $width[1].Length + 2
[PsCustomObject]@{
'Name' = $_.Substring(0, $width[0].Length).Trim()
'SID' = $_.Substring($sidStart, $width[2].Length).Trim()
'Type' = $type
}
}
}
}
}
# output on screen
$result | Format-Table -AutoSize
# output to CSV file
$result | Export-Csv -Path 'UsersAndSids.csv' -NoTypeInformation
Обновление The whoami
также имеет переключатель /FO CSV
, с помощью которого вывод выводится в формате CSV с пустыми строками между пользователем и группами данных. К сожалению, этот вывод также локализован.
Однако, используя вычисляемые свойства, можно возвращать имена свойств на английском языке.
Код для этого подхода, для удобства в функции:
function Parse-WhoAmI {
$nl = [Environment]::NewLine
# join the array with newlines and split into two blocks on the empty line
# the first block contains User info; the second block is for the groups
$data = ((whoami /ALL /FO CSV) -join $nl) -split "$nl$nl" | Select-Object -First 2
# output the user data with English column names
$userdata = $data[0] | ConvertFrom-Csv
$headers = $userdata[0].PSObject.Properties.Name # get the localized header names
$userdata | Select-Object @{Name = 'Name'; Expression = { $_.$($headers[0]) }},
@{Name = 'SID'; Expression = { $_.$($headers[1]) }},
@{Name = 'Type'; Expression = { 'User' }}
# do the same for the Groups block
$groupdata = $data[1] | ConvertFrom-Csv
$headers = $groupdata[0].PSObject.Properties.Name
$groupdata | Select-Object @{Name = 'Name'; Expression = { $_.$($headers[0]) }},
@{Name = 'SID'; Expression = { $_.$($headers[2]) }},
@{Name = 'Type'; Expression = { 'Group' }}
}
# call the function
$result = Parse-WhoAmI
# output on screen
$result | Format-Table -AutoSize
# output to CSV file
$result | Export-Csv -Path 'UsersAndSids.csv' -NoTypeInformation