Mit Hilfe dieses Powershell Skripts ist es möglich eine Gruppe zu „log on as a batch job“ und/oder „runAsService“ hinzuzufügen. Natürlich ist die Konfiguration über GPO deutlich einfacher, hat aber den Nachteil, dass die bestehenden Einträge überschrieben werden. Achtung!: Auch mit diesem Skript werden die bestehenden Einträge überschrieben, wenn nicht jeweils mind. 2 Werte (z. B. Administrators, Backup Operators) vorhanden sind, hier gibt es ein Problem mit einem fehlenden Trennzeichen bei nur einem Wert.
Was macht das Skript?
Es öffnet eine Remote Session, erstellt zwei lokale Gruppen „runAsService“ sowie „logonAsABatchJob“ und fügt 2 AD Gruppen „$LogonAsServiceGRP“ und $LogonAsBatchGRP als Mitglied hinzu. Anschließend werden die beiden lokalen Gruppen auf dem Server berechtigt.
$ServerName = "Servername01.company.com" # <-- hier bitte den Servernamen eintragen
$Session = New-PSSession -ComputerName $ServerName
Invoke-Command -Session $Session -ScriptBlock {
# AD-Gruppennamen generieren
$LogonAsServiceGRP = "ADrunAsService"
$LogonAsBatchGRP = "ADlogonAsABatchJob"
$groups = @(
@{ Name = "runAsService"; ADGroup = $LogonAsServiceGRP; Right = "SeServiceLogonRight" },
@{ Name = "logonAsABatchJob"; ADGroup = $LogonAsBatchGRP; Right = "SeBatchLogonRight" }
)
foreach ($group in $groups) {
# Lokale Gruppe erstellen, falls nicht vorhanden
if (-not (Get-LocalGroup -Name $group.Name -ErrorAction SilentlyContinue)) {
New-LocalGroup -Name $group.Name -Description "Automatisch erstellt für Berechtigungszuweisung"
}
# AD-Gruppe als Mitglied hinzufügen
if ($group.ADGroup) {
try {
Add-LocalGroupMember -Group $group.Name -Member $group.ADGroup -ErrorAction Stop
} catch {
Write-Warning "Fehler beim Hinzufügen von $($group.ADGroup) zu $($group.Name): $_"
}
} else {
Write-Warning "ADGroup für $($group.Name) ist leer oder ungültig."
}
# Benutzerrechte exportieren
$exportPath = "$env:TEMP\rights-export.inf"
secedit /export /cfg $exportPath /areas USER_RIGHTS
# Inhalt einlesen
$content = Get-Content $exportPath
$index = -1
for ($i = 0; $i -lt $content.Count; $i++) {
if ($content[$i] -match "^$($group.Right)\s*=") {
$index = $i
break
}
}
# Bestehende Einträge extrahieren
$existingEntries = @()
if ($index -ge 0) {
$existing = $content[$index] -replace "^$($group.Right)\s*=\s*", ""
$existingEntries = $existing -split "," | ForEach-Object { $_.Trim() }
} else {
$index = $content.Count
$content += ""
}
# Gruppeneintrag hinzufügen, falls nicht vorhanden
if ($existingEntries -notcontains $group.Name) {
$existingEntries += $group.Name
}
# Neue Zeile schreiben
$content[$index] = "$($group.Right) = " + (($existingEntries | Sort-Object -Unique | ForEach-Object { $_ }) -join ",")
# Neue INF-Datei speichern
$modifiedPath = "$env:TEMP\rights-modified.inf"
$content | Set-Content $modifiedPath -Encoding Unicode
# Anwenden der neuen Richtlinie
secedit /configure /db "$env:TEMP\rights.sdb" /cfg $modifiedPath /areas USER_RIGHTS
}
Write-Host "`n✔️ Gruppen und Rechte wurden erfolgreich konfiguriert." -ForegroundColor Green
}
#Remote-Session schließen
Remove-PSSession -Session $Session

Neueste Kommentare