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

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

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

secedit /export /areas USER_RIGHTS /cfg output.txt

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

[Unicode]
Unicode = да
[Права привилегий]
SeNetworkLogonRight = * S-1-5-32-544
...
SeTakeOwnershipPrivilege = * S-1-5-32-544
...
[Версия]
подпись = "$ CHICAGO $"
Редакция = 1

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

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

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

ура

Дэвид

5 ответов5

0

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

Вы можете использовать утилиту Microsoft AccessChk (скачать ее здесь) вместо 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"
}
0

Существует еще один способ использования функции Win32 API LsaEnumerateAccountsWithUserRight . Это должно быть закодировано в 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()
        }
}
0

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

-1

Может быть, эта команда будет полезна

Get-WmiObject -Class win32_userprofile
-1

Вот решение:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .