
Ich muss überprüfen, dass nur die Administratorgruppe (SID: S-1-5-32-544) das Recht hat, den Besitz von Dateien oder Ordnern zu übernehmen (SeTakeOwnershipPrivilege).
Wie erhalte ich eine Übersicht über alle Benutzer/Gruppen, die dieses Privileg haben?
Was ich bereits gefunden und ausprobiert habe, ist der folgende Befehl:
secedit /export /areas USER_RIGHTS /cfg output.txt
Die Ausgabe in der Datei sieht ziemlich brauchbar aus:
[Unicode]
Unicode=ja
[Berechtigungen]
SeNetworkLogonRight = *S-1-5-32-544
...
SeTakeOwnershipPrivilege = *S-1-5-32-544
...
[Version]
signature="$CHICAGO$"
Revision=1
Bei der obigen Methode müsste ich die Datei in mein Powershell-Skript einlesen, nach der Berechtigung suchen und die Datei anschließend löschen.
Gibt es eine andere Methode, dies in Powershell ohne externe Module oder ausführbare Dateien zu tun?
Vielen Dank für Ihre Lieferung.
Prost
David
Antwort1
Es gibt noch eine andere Möglichkeit, mit demLsaEnumerateAccountsWithUserRightWin32 API-Funktion. Diese muss in C# codiert werden (PInvoke) in Ihrem Skript und die Codedefinition wäre sehr lang und unübersichtlich.
Ich würde das oben genannte vermeiden und stattdessen die ausführbare Datei umschließen. Warum das Rad neu erfinden?
# 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()
}
}
Antwort2
Keine reine PS-Lösung, aber dennoch eine Option. :)
Sie können das Dienstprogramm AccessChk von Microsoft verwenden (hier herunterladen) anstelle von SecEdit.
Im Gegensatz zu SecEdit gibt AccessChk an die Standardausgabe aus, sodass Sie die Ausgabe problemlos in einer PS-Variable erfassen und diese Variable anschließend überprüfen können (ohne dass eine Zwischendatei erforderlich ist).
Etwas wie:
$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"
}
Antwort3
Schamlose Werbung: Schauen Sie sich dieCarbon-Modul(Ich bin der Ersteller/Betreuer). Es hat eineGet-PrivilegeFunktion, die alle Berechtigungen eines Auftraggebers zurückgibt.
Antwort4
Hier ist die Lösung:
(Get-WmiObject -Namespace root\rsop\computer -Class RSOP_UserPrivilegeRight | Where-Object {$_.UserRight -eq "SeTakeOwnershipPrivilege"}).AccountList