Как можно получить обзор всех пользователей с определенным именем прямо в Windows?

Как можно получить обзор всех пользователей с определенным именем прямо в Windows?

Мне нужно проверить, что только группа администраторов (sid: S-1-5-32-544) имеет право стать владельцем файлов или папок (SeTakeOwnershipPrivilege).

Как я могу получить обзор всех пользователей/групп, имеющих эту привилегию?

Я уже нашел и попробовал следующую команду:

secedit /export /areas USER_RIGHTS /cfg output.txt

Вывод в файле выглядит весьма полезным:

[Unicode]
Unicode=yes
[Права привилегий]
SeNetworkLogonRight = *S-1-5-32-544
...
SeTakeOwnershipPrivilege = *S-1-5-32-544
...
[Версия]
signature="$CHICAGO$"
Revision=1

При использовании вышеописанного метода мне пришлось бы прочитать файл в моем скрипте Powershell, выполнить поиск привилегий и затем удалить файл.

Есть ли другой способ сделать это в Powershell без внешних модулей или исполняемых файлов?

Спасибо за вашу поставку.

Ваше здоровье

Дэйвид

решение1

Есть еще один способ использованияLsaEnumerateAccountsWithUserRightФункция API Win32. Это должно быть закодировано на C# (PInvoke) в вашем скрипте, и определение кода будет очень длинным и запутанным.

Я бы избежал вышеизложенного и вместо этого обернул исполняемый файл. Зачем изобретать велосипед?

# Check this priviledge.
$privilege = 'SeDenyInteractiveLogonRight'

# Create temp file for executable output.
$tempFile = [System.IO.Path]::GetTempFileName()

# Run the executable and wait for it to finish.
Start-Process -FilePath secedit.exe -ArgumentList "/export /areas USER_RIGHTS /cfg $tempFile" -Wait -WindowStyle Hidden

# Run through lines in the output file. 
Get-Content $tempFile -Encoding Unicode | Where-Object { 

    # Where the privilege is listed.
    $_ -match $privilege } | ForEach-Object { 

        # Seperate the key and values.    
        $_.split('=')[1].split(',') | ForEach-Object {

            # Ouput the user/SID values        
            $_.trim()
        }
}

решение2

Не чисто PS-решение, но тем не менее вариант. :)

Вы можете использовать утилиту AccessChk от Microsoft (скачать здесь) вместо SecEdit.

В отличие от SecEdit, AccessChk выводит данные на стандартный вывод, поэтому вы можете легко сохранить его вывод в переменную PS, а затем проверить эту переменную (без необходимости в промежуточном файле).

Что-то вроде:

$privToCheckFor = "SeTakeOwnershipPrivilege"
$groupPrivs = .\accesschk -a administrators *
if ((Out-String -InputObject $groupPrivs).IndexOf($privToCheckFor) -ge 0) {
    Write-Host "Has Privilege"
} else {
    Write-Host "Doesn't Have Privilege"
}

решение3

Бесстыдная реклама: посмотритеУглеродный модуль(Я создатель/поддерживающий). Он имеетПолучить-Привилегиюфункция, которая вернет все привилегии принципала.

решение4

Вот решение:

(Get-WmiObject -Namespace root\rsop\computer -Class RSOP_UserPrivilegeRight | Where-Object {$_.UserRight -eq "SeTakeOwnershipPrivilege"}).AccountList

Связанный контент