Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

activedirectory:addelegate

Delegationen setzen (Powershell)

funktionierende Powershell-Funktion

function setadpermission ([string]$distinguishedName, [string]$Username, [string]$AccessType, [int]$AccessRights, [string]$Inheritance, [string]$objectGuid, [string]$DC, [string]$AdminAccount, [string]$Password)
{
	$ADObject = "AD:\$distinguishedName"
	$PW = ConvertTo-Securestring $Password -AsPlainText -force
	$Credential = New-Object System.Management.Automation.PSCredential($AdminAccount,$PW)
	$Session = New-PSSession -ComputerName $DC -Credential $Credential
	Invoke-Command -Session $Session -Command {Import-Module ActiveDirectory}
	Invoke-Command -Session $Session -Command {param ($a1) $ADObject = $a1} -ArgumentList $ADObject
	Invoke-Command -Session $Session -Command {param ($a1) $Username = $a1} -ArgumentList $UserName
	Invoke-Command -Session $Session -Command {param ($a1) $AccessType = $a1} -ArgumentList $AccessType
	Invoke-Command -Session $Session -Command {param ($a1) $AccessRights = $a1} -ArgumentList $AccessRights
	Invoke-Command -Session $Session -Command {param ($a1) $Inheritance = $a1} -ArgumentList $Inheritance
	Invoke-Command -Session $Session -Command {param ($a1) $objectGuid = $a1} -ArgumentList $objectGuid
	Invoke-Command -Session $Session -Command {$ArrayAcc = $Username.Split("\")}
	Invoke-Command -Session $Session -Command {$Account = New-Object System.Security.Principal.NTAccount($ArrayAcc[0], $ArrayAcc[1])}
	Invoke-Command -Session $Session -Command {$ACT = [System.Security.AccessControl.AccessControlType]::$AccessType}
	Invoke-Command -Session $Session -Command {$ADR = New-Object System.DirectoryServices.ActiveDirectoryRights}
	Invoke-Command -Session $Session -Command {$ADR.value__ = $AccessRights}
	Invoke-Command -Session $Session -Command {$Guid = New-Object System.Guid($objectGuid)}
	Invoke-Command -Session $Session -Command {$Inherit = [System.DirectoryServices.ActiveDirectorySecurityInheritance]::$Inheritance}
	Invoke-Command -Session $Session -Command {$NewRule = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($Account,$ADR,$ACT,$Guid,$Inheritance)}
	Invoke-Command -Session $Session -Command {$acl = get-acl $ADObject} 
	Invoke-Command -Session $Session -Command {$acl.addaccessrule($NewRule)} 
	Invoke-Command -Session $Session -Command {Set-ACL $ADObject $acl}
	Remove-PSSession $Session
}

ParameterInhalt
distinguishedNameDistinguishedName des Objekts, auf dem Berechtigungen gesetzt werden sollen
UsernameObjekt, das berechtigt werden soll im Format NetBiosDomain\SamAccountName. Entgegen des Parameternamens können z.B. auch Gruppen berechtigt werden.
AccessTypeAllow oder Deny
AccessRightsIntegerzahl. Wie man an die Zahl kommt, steht im nächsten Abschnitt
InheritanceVererbungsregel. Folgende Werte sind erlaubt:
None: Keine Vererbung
All: Die Regel gilt für das Objekt selbst seine Kind-Objekte und dessen Kind-Objekte und so weiter, bis alle untergeordneten Objekte erfasst sind
Children: Nur die direkten Kind-Objekte
Descendents: Nur die direkt untergeordneten Objekte und deren Kind-Objekte
SelfAndChildren: Nur das Objekt selbst und dessen direkt untergeordneten Objekte
objectGuidBerechtigungsschema, welche Attribute der betroffenen AD-Objekte verändert werden dürfen. Näheres dazu im übernächsten Abschnitt
DCDomänencontroller
AdminAccountEin Benutzer mit Adminrechten für die Domäne. Muss im Format NetBiosName\SamAccountName angegeben werden
PasswordDas Passwort des Adminbenutzers

WICHTIG Scripte, die diese Funktion verwenden, sollten nur in einem gut geschützten Bereich abgelegt werden, da das Passwort da noch unverschlüsselt ist. Ich werde das später mal umbauen 1)!

Dieses Script erzeugt eine PSSession, übergibt dann dem angegebenen Domänencontroller alle wichtigen Werte. Anschließend holt es sich die Sicherheitsbeschreibung des angegebenen AD-Objekts, fügt eine Sicherheitsregel hinzu und schreibt die erweiterte Sicherheitsbeschreibung zurück. Abschließend wird die PSSession zerstört.

Die ActiveDirectoryRights bestimmen

Suche oder erstelle dir mit den grafischen Werkzeugen die benötigte Delegation beispielhaft an einem AD-Objekt.

Dann gehts weiter in der Powershell:

Import-Module ActiveDirectory

Importiert die ActiveDirectory-bezogenen Cmdlets der Powershell und bindet die Active Directory als PSDrive AD: ein. Müssen ggf. durch die RSAT-Werkzeuge nachinstalliert werden.

$ACL = Get-Acl AD:\'DistinguishedNameDesADOjektsMitDenRichtigenRechten'

Ruft die Sicherheitsbeschreibung des gewünschten Objekts ab

$ACL.Access | ?{$_.IdentityReference -eq "Netbios\SamAccountName"}

Ruft alle Sicherheitsregeln (ACE) ab, die für den Benutzer Netbios\SamAccountName vorhanden sind und sieht in etwa so aus:

PS C:\> $ACL.Access | ?{$_.IdentityReference -eq "Dom\TestGroup"}


ActiveDirectoryRights : ReadProperty, WriteProperty
InheritanceType       : All
ObjectType            : bf9679c0-0de6-11d0-a285-00aa003049e2
InheritedObjectType   : 00000000-0000-0000-0000-000000000000
ObjectFlags           : ObjectAceTypePresent
AccessControlType     : Allow
IdentityReference     : DOM\TestGroup
IsInherited           : False
InheritanceFlags      : ContainerInherit
PropagationFlags      : None

Der erforderliche Wert steckt in der Zeile ActiveDirectoryRights. Wir speichern die Sicherheitsregel in einer eigenen Variablen, um leichter darauf zugreifen zu können:

$ExampleRule = $ACL.Access | ?{$_.IdentityReference -eq "Dom\TestGroup"}

Wenn es mehrere Regeln für den User/die Gruppe gibt, ist ExampleRule ein Array. In diesem Fall kann man die erste Sicherheitsregel mit $ExampleRule[0], die zweite mit $ExampleRule[1] (usw.) abrufen. Wir gehen hier davon aus, dass nur eine Regel gefunden wurde:

$ExampleRule.ActiveDirectoryRights.value__

Als Ergebnis erhält man eine Zahlenausgabe, die in die oben beschriebene Funktion angegeben werden kann.

ObjectType ermitteln

Das ObjectType ist eine maskierung, für welche AD-Attribute die in der Sicherheitsregel beschriebenen Rechte gelten sollen. Soll die Berechtigung für alle Attribute gelten, nimmt man den String 00000000-0000-0000-0000-000000000000

Andernfalls kann man sich ein Testobjekt erzeugen, dem mit grafischen Werkzeugen die gewünschte Delegation vergeben, und sich die Sicherheitsregel wie weiter oben beschrieben holen. Dort steht der angepasste ObjectType dann in der entsprechenden Zeile.

Altes Zeugs (Recherche und so)

Berechtigungen abrufen:

$a = Get-Acl AD:\'CN=Tester1,OU=Ou1,OU=OU2,OU=OU3,DC=Contoso,DC=com').Access
$a.Access[0].ActiveDirectoryRights.value__

Berechtigung schreiben

$path = "AD:\CN=Tester1,OU=Ou1,OU=OU2,OU=OU3,DC=Contoso,DC=com"
$acl = Get-Acl -Path $path
$ace = New-Object Security.AccessControl.ActiveDirectoryAccessRule('DOMAIN\Computername','FullControl')
$acl.AddAccessRule($ace)
Set-Acl -Path $path -AclObject $acl

Weitere Informationen zu der ActiveDirectoryAccessRule: Link

Quellen: Link

Edit: Selbst ermittelt geht folgendes:

$account = New-Object System.Security.Principal.NTAccount("evv", "rkaufmann")
$act = new-object System.Security.AccessControl.AccessControlType
$act.value__ = 0
$adr = new-object System.DirectoryServices.ActiveDirectoryRights
$adr.value__ = 48
$inherit = new-object System.DirectoryServices.ActiveDirectorySecurityInheritance
$inherit.value__ = 0
$ot = new-object System.Guid("bf9679c0-0de6-11d0-a285-00aa003049e2")
 
 
New-Object System.DirectoryServices.ActiveDirectoryAccessRule($account,$adr,$act,$ot,$inherit)

führt zu folgender ACE:

ActiveDirectoryRights : ReadProperty, WriteProperty
InheritanceType       : All
ObjectType            : bf9679c0-0de6-11d0-a285-00aa003049e2
InheritedObjectType   : 00000000-0000-0000-0000-000000000000
ObjectFlags           : ObjectAceTypePresent
AccessControlType     : Allow
IdentityReference     : EVV\rkaufmann
IsInherited           : False
InheritanceFlags      : None
PropagationFlags      : None

Das ist genau die ACE, die eine BErechtigung zum Lesen und Schrreiben von Mitgliedern einer Gruppe benötigt wird. Ausschlaggebend ist die Eigenschaft ObjectType, die auf ein Object im AD-Schema verweist. Infos dazu gibt es hier:

1)
Man kann Passwörter wohl auch verschlüsselt speichern. Mehr dazu gibt es hier
activedirectory/addelegate.txt · Zuletzt geändert: 2016/04/15 13:43 von ronny