Modyfikowanie uprawnień szablonu certyfikatów

W ramach jednego projektu natknąłem się na drobny problem związany z modyfikacją szablonów certyfikatów w ramach urzędu certyfikacyjnego usługi Active Directory. Modyfikacja ta polegała głównie udostępnieniu konkretnej grupie użytkowników praw do automatycznej rejestracji konkretnych szablonów certyfikatów. Poprzez graficzny interfejs sprawa wygląda bardzo prosto niemniej nie da się jej zautomatyzować, co znów dla PowerShella nie stanowi to większy problem.

By jednak tego dokonać najpierw musimy się dostać do kontenera przechowującego nasze szablony certyfikatów. Z racji, iż współpracuje on z usługą Active Directory to możemy tego dokonać poprzez akcelerator ADSI. Cała baza szablonów jest zapisywana jest pod ścieżką  LDAP://CN=Certificate Templates,CN=Public Key Services,CN=Services,<Configuration Naming Context>

$ConfigContext = ([ADSI]"LDAP://RootDSE").ConfigurationNamingContext/
$ADSI = [ADSI]"LDAP://CN=Certificate Templates,CN=Public Key Services,CN=Services,$ConfigContext"

Obecnie w naszej zmiennej $ADSI znajdują się wszytskie dostępne szablony dlatego przed przystąpieniem do dodawania będziemy musieli sprawdzić czy nasze szablony znajdują się na liście. A następnie spróbujmy dodać uprawnienia do odpowiednich szablonów, ale by tego dokonać musimy wykorzystać pętlę ForEach.

$TemplateList = "Machine", "Workstation", "User"
$ADSI.psbase.children | ForEach {
$CurrentTempl = $_
If($TemplateList -contains $CurrentTempl.Name)
{ ... }
}

Aby odczytać obecne uprawnienia możemy posłużyć się metodą psbase.ObjectSecurity

$ACL = $CurrentTempl.psbase.ObjectSecurity
$ACL | select -ExpandProperty Access

Natomiast by nadać nowe uprawnienia do obiektu konieczne jest najpierw utworzenie nowego obiektu typu ActiveDirectoryAccessRule. Zanim jednak go utworzymy sprepatujmy sobie odpowiednie parametry jakie będzie on posiadał. Mianowicie Identity Reference, Active Directory Rights oraz Access Control Type.

Identity Reference – jest to obiekt identyfikujący naszego użytkownika lub grupę, dla którego mają zostać nadane uprawnienia.

$NTAccount = New-Object System.Security.Principal.NTAccount("<group name>")
$IdentityReference  = $NTAccount.Translate([System.Security.Principal.SecurityIdentifier])

Active Directory Rights – są to odpowiednie uprawnienia jakie mają być nadane dla obiektów usługi Active Directory. Dla autorejestracji można przypisać uprawnienia „ExtendedRight”. Szczegóły znaleźć można na stronie MSDN.

$ActiveDirectoryRights  = "ExtendedRight"

Ostatnim parametrem jest Access Control Type – czyli czy zamierzamy nadać dostęp danemu użytkownikowi czy go zabronić

$AccessControlType  = "Allow"

Gdy posiadamy już wszystkie parametry dla naszego obiektu ActiveDirectoryAccessRule tworzymy jego nową instancję.

$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($IdentityReference,$ActiveDirectoryRights,$AccessControlType)

Przypisujemy są dodanego szablonu I zatwierdzamy całość metodą psbase.commitchanges()

$CurrentTempl.psbase.ObjectSecurity.SetAccessRule($ACE)
$CurrentTempl.psbase.commitchanges()

Całość wygląda następująco:

$ConfigContext = ([ADSI]"LDAP://RootDSE").ConfigurationNamingContext
$ADSI = [ADSI]"LDAP://CN=Certificate Templates,CN=Public Key Services,CN=Services,$ConfigContext"

$TemplateList = "Machine", "Workstation", "User"
$ADSI.psbase.children | ForEach {

$CurrentTempl = $_

If($TemplateList -contains $CurrentTempl.Name)
{
$NTAccount = New-Object System.Security.Principal.NTAccount("TestGroup")
$IdentityReference = $NTAccount.Translate([System.Security.Principal.SecurityIdentifier])

$ActiveDirectoryRights = "ExtendedRight"

$AccessControlType = "Allow"
$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($IdentityReference,$ActiveDirectoryRights,$AccessControlType)
$CurrentTempl.psbase.ObjectSecurity.SetAccessRule($ACE)
$CurrentTempl.psbase.commitchanges()

($CurrentTempl.psbase.ObjectSecurity).Access | Where-Object {$_.IdentityReference -match "TestGroup"} | Select-Object @{Label="Tmplate";Expression={$CurrentTempl.Name}}, IdentityReference, ActiveDirectoryRights
}
}

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s