
Мне нужно проверить, что только группа администраторов (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