Как мне получить номер SID от whoami / all в Powershell? - PullRequest
1 голос
/ 23 декабря 2019

Я пытался whoami /all | Select-String -Pattern 'SID', но вместо значения он получает только строку 'SID'. Есть предложения?

Ответы [ 4 ]

2 голосов
/ 23 декабря 2019

Проблема с whoami заключается в том, что он просто возвращает массив строк, которые затем необходимо проанализировать самостоятельно. Вы обязаны использовать whoami? Есть более удобные способы найти свой SID. Например:

(New-Object System.Security.Principal.NTAccount($env:username)).Translate([System.Security.Principal.SecurityIdentifier]).value

Если вам нужно использовать whoami, это работает для меня ... но может произойти сбой, если вывод не соответствует ожидаемому:

$data = whoami /all
foreach ($line in $data){
    if ($line -match "SID"){ #search for the first occurence of "SID"
        [int]$index = $data.indexof($line) + 2 #skip title + delimiter
        break
    }
}
write-host "username: $($data[$index].split(' ')[0])"
write-host "SID: $($data[$index].split(' ')[1])"
1 голос
/ 23 декабря 2019

Для анализа всех пользователей и групп из вывода 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
0 голосов
/ 23 декабря 2019

Дополнительные параметры wmi:

get-ciminstance win32_useraccount | select name,sid

get-ciminstance win32_userprofile | select localpath,sid

get-localuser | select name,sid
0 голосов
/ 23 декабря 2019

Вы можете использовать wmi для этого:

Get-WMIobject -Query "Select SID From Win32_UserAccount" | Foreach {Write-Host $_.SID}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...