Skip to content

Instantly share code, notes, and snippets.

@DiHo78
Last active Sep 27, 2020
Embed
What would you like to do?
DelegationNotebook
{
"metadata": {
"kernelspec": {
"name": "powershell",
"display_name": "PowerShell"
},
"language_info": {
"name": "powershell",
"codemirror_mode": "shell",
"mimetype": "text/x-sh",
"file_extension": ".ps1"
}
},
"nbformat_minor": 2,
"nbformat": 4,
"cells": [
{
"cell_type": "markdown",
"source": [
"## Delegierungs Setup - Draft\r\n",
"\r\n",
"Dieses kleine Notebook soll helfen eine Delegierung aufzusetzen.\r\n",
"Benötigt werden in der Regel ja ggf. Aliase im DNS. \r\n",
"Dann SPNs, welche einem Service Konto zugeordnet sind.\r\n",
"Am Ende benötigt dann ein Account die Delegiernug auf einen entsprechenden SPN."
],
"metadata": {
"azdata_cell_guid": "3a2aac85-8d7f-44ae-b7db-b5de4842ef24"
}
},
{
"cell_type": "markdown",
"source": [
"### Aliase im DNS\r\n",
"Zuerst sollten die entsprechenden Variablen definiert werden, was so hier und da benötigt wird. Im unten stehenden Beispiel auf das -WhatIf achten. Der Code wird dadurch NICHT ausgeführt."
],
"metadata": {
"azdata_cell_guid": "52882017-e7bc-420d-809e-c6d5fa06cb25"
}
},
{
"cell_type": "code",
"source": [
"#'CNAME/Alias erstellen \r\n",
"#'''''''''''''''''''''''''\r\n",
"# import-module dnsserver\r\n",
"<# Reminder\r\n",
"https://docs.microsoft.com/en-us/powershell/module/dnsserver/?view=win10-ps\r\n",
"DnsServer Module can be obtained either by installing DNS Server role or adding the DNS Server Tools part of Remote Server Administration Tools (RSAT) feature.\r\n",
"#>\r\n",
"$domain = 'domain.local'\r\n",
"$AliasName = 'SQL-MyAlias.domain.local'\r\n",
"$targetServer = 'MyTgtServer'\r\n",
"$target = $targetServer + '.' + $domain\r\n",
"$target\r\n",
"\r\n",
"$DNSSrv = 'MyDNS.Domain.local'\r\n",
"\r\n",
"Add-DnsServerResourceRecordCName -Name $AliasName -HostNameAlias $target -ZoneName $domain -Verbose -ComputerName $DNSSrv -WhatIf"
],
"metadata": {
"azdata_cell_guid": "26e8605a-4747-49c3-8a83-a4b399d80eae",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"Benötigen wir mehr als einen Alias, dann kann man vorab natürlich ein Array von aliasen definieren und dann die über eine ForEach Schleife anlegen. Wichtig ist aber, dass die Aliase den gleichen Ziel-Host als Target haben! \r\n",
"Beispiele:"
],
"metadata": {
"azdata_cell_guid": "a3315824-3d97-4802-9cd3-0e41334e05ad"
}
},
{
"cell_type": "code",
"source": [
"#'CNAME/Alias erstellen - Loop Example\r\n",
"#'''''''''''''''''''''''''\r\n",
"$domain = 'domain.local'\r\n",
"$AliasNameArray = @(\"SMyFirstAlias\",\"MySecondAlias\")\r\n",
"$targetServer = 'MyTgtServer'\r\n",
"$target = $targetServer + '.' + $domain\r\n",
"#$target\r\n",
"\r\n",
"$DNSSrv = 'MyDNS.Domain.local'\r\n",
"\r\n",
"ForEach ($AliasName in $AliasNameArray){\r\n",
"Add-DnsServerResourceRecordCName -Name $AliasName -HostNameAlias $target -ZoneName $domain -Verbose -ComputerName $DNSSrv -WhatIf\r\n",
"}\r\n",
""
],
"metadata": {
"azdata_cell_guid": "ba0154a8-ad61-4787-a329-a1477c76044f",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"source": [
"#CNAME /Alias noch etwas komplizierter, aber dann wird es irgendwann echt too much :-)\r\n",
"$domain = 'domain.local'\r\n",
"$DNSSrv = 'MyDNS.Domain.local'\r\n",
"$arrayTargetEnvironment = @(\"P\", \"Q\")\r\n",
"$arrayTargetServiceType = @(\"DB\", \"AS\")\r\n",
"$targetServer = 'MyTgtServer'\r\n",
"$targetServiceType = 'My-SQL-AppAlias-'\r\n",
"foreach ($targetenv in $arrayTargetEnvironment) {\r\n",
" $target = $targetServer + $targetenv + '.' + $domain\r\n",
" #$target \r\n",
" foreach ($targetService in $arrayTargetServiceType) {\r\n",
" #$target\r\n",
" $AliasName = $targetServiceType + $targetService + '-' +$targetenv \r\n",
" #$AliasName\r\n",
" Write-Host 'Schreibe ' $AliasName ' mit Ziel auf ' $target\r\n",
" Add-DnsServerResourceRecordCName -Name $AliasName -HostNameAlias $target -ZoneName $domain -Verbose -ComputerName $DNSSrv -WhatIf\r\n",
" }\r\n",
"}\r\n",
""
],
"metadata": {
"azdata_cell_guid": "9be14fba-ed48-466f-a58d-3b5182e13b75",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"### SPN erzeugen\r\n",
"Sind die entsprechenden Aliase im DNS gesetzt, so muss ein Alias einem (g)MSA zugeordnet werden. Zwar kann man hier auch wieder mit einigen Variablen das ganze rel. dynamisch machen, aber Zwecks einfachem Nachverfolgen dann lieber ein paar manuelle Schritte mehr.\r\n",
"Wichtig ist, dass man immer das richtige Srv Kto und den richtigen Service adressiert. Also ein DB Svc User bekommt ein MSSQL SPN. Ein AS Svc User bekommt ein MSOLAP SPN.\r\n",
"\r\n",
"Gelöst wird dies hier im Notebook mit 2 separaten Code Zellen. Einmal für **DB** und einmal für **AS**."
],
"metadata": {
"azdata_cell_guid": "2d214aec-36bf-4c2d-a857-60ddb81e5db1"
}
},
{
"cell_type": "code",
"source": [
"#SPN SETZEN DB Service\r\n",
"$MeinServiceKto = \"MyServiceAccount\" \r\n",
"#Variablen fuer Alias, Environment, Dienst\r\n",
"$AliasApp = \"MyApp\"\r\n",
"$TargetEnv = \"P\"\r\n",
"$Svc = \"MSSQLSvc\"\r\n",
"$domain = 'domain.local'\r\n",
"$MeinServiceKonto = $MeinServiceKto + $TargetEnv\r\n",
"$MeinServiceKonto\r\n",
"\r\n",
"\r\n",
"$DBSPNs2Add = @()\r\n",
"$DBSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-DB-'+$Targetenv+'.'+$domain+':1433' #still a bit static\r\n",
"$DBSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-DB-'+$Targetenv+'.'+$domain #still a bit static\r\n",
"$DBSPNs2Add\r\n",
"\r\n",
"\r\n",
"$mySvcAcc = Get-ADServiceAccount -Identity $MeinServiceKonto\r\n",
"$mySvcAcc.DistinguishedName\r\n",
"#SPN hinzufügen\r\n",
"Set-ADObject -Identity $mySvcAcc -Add @{\"ServicePrincipalName\"=$DBSPNs2Add} -Verbose -WhatIf"
],
"metadata": {
"azdata_cell_guid": "bde39c73-9690-4b1a-80fa-e506686b528e",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"source": [
"#einmal gucken was gesetzt wurde\r\n",
"Get-ADServiceAccount -Identity \"$MeinServiceKonto\" -Properties * | Select-Object displayname -ExpandProperty serviceprincipalname | Format-Table"
],
"metadata": {
"azdata_cell_guid": "4c9de15d-2e54-4f4d-8312-bd98939c4fb6",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"source": [
"#SPN SETZEN SSAS Service\r\n",
"$MeinServiceKto = \"MyServiceAccount\" \r\n",
"#Variablen fuer Alias, Environment, Dienst\r\n",
"$AliasApp = \"MyApp\"\r\n",
"$TargetEnv = \"Q\"\r\n",
"$Svc = \"MSOLAPSvc.3\"\r\n",
"$domain = 'domain.local'\r\n",
"$MeinServiceKonto = $MeinServiceKto + $TargetEnv\r\n",
"$MeinServiceKonto\r\n",
"\r\n",
"$DBSPNs2Add = @()\r\n",
"$DBSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-AS-'+$Targetenv #still a bit static\r\n",
"$DBSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-AS-'+$Targetenv+'.'+$domain #still a bit static\r\n",
"$DBSPNs2Add\r\n",
"\r\n",
"\r\n",
"$mySvcAcc = Get-ADServiceAccount -Identity $MeinServiceKonto\r\n",
"$mySvcAcc.DistinguishedName\r\n",
"#SPN hinzufügen\r\n",
"Set-ADObject -Identity $mySvcAcc -Add @{\"ServicePrincipalName\"=$DBSPNs2Add} -Verbose -WhatIf"
],
"metadata": {
"azdata_cell_guid": "df86fca3-4e58-4646-9547-1b7972741720",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"source": [
"#einmal gucken was gesetzt wurde\r\n",
"Get-ADServiceAccount -Identity \"$MeinServiceKonto\" -Properties * | Select-Object displayname -ExpandProperty serviceprincipalname | Format-Table"
],
"metadata": {
"azdata_cell_guid": "114343b8-854e-445e-98af-ed0b05e6cafc",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "markdown",
"source": [
"## Delegierung konfigurieren:\r\n",
"\r\n",
"Für die Delegierung muss dem Konto, welches delegieren soll, mitgeteilt werden, wohin delegiert werden kann.\r\n",
"Vorab müssen also folgende infos gesammelt werden:\r\n",
"* involviertes ServiceKonto und/oder ComputerKonto\r\n",
"* Ziel SPNs\r\n",
"\r\n",
"Die unten stehende Code Zellen fügt einem ausgewählten ServiceAccount die SPNs, welche man in dem Array pflegen kann, dem Attribut **AllowedToDelegateTo** zu. \r\n",
"Die erste Zelle ist für ein **normales** Benutzerkonto, die zweite Zelle für einen **(group)ManagedServiceAccount**. Der Unterschied ist im **Set-** Befehl zu erkennen.\r\n",
"Die dritte Zelle ist zum Setzen einer Delegierung von einem **ComputerKonto** zu einem SPN."
],
"metadata": {
"azdata_cell_guid": "6795ffe2-4732-4496-a6db-b5da45de648c"
}
},
{
"cell_type": "code",
"source": [
"#Hilfszelle fuer SPN Strings bauen, sofern man die oben erstellten Variablen nicht weiter verwenden will:\r\n",
"$AliasApp = \"MyApp\"\r\n",
"$TargetEnv = \"P\"\r\n",
"$Svc = \"MSOLAPSvc.3\" #$Svc = \"MSSQLSvc\"\r\n",
"$domain = 'domain.local'\r\n",
"\r\n",
"\r\n",
"$ASSPNs2Add = @()\r\n",
"$ASSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-AS-'+$Targetenv \r\n",
"$ASSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-AS-'+$Targetenv+'.'+$domain\r\n",
"$ASSPNs2Add\r\n",
"\r\n",
"$Svc = \"MSSQLSvc\" #ACHTUNG Service Switch\r\n",
"\r\n",
"$DBSPNs2Add = @()\r\n",
"$DBSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-DB-'+$Targetenv+'.'+$domain+':1433' #still a bit static\r\n",
"$DBSPNs2Add += $svc+ '/SQL-'+$AliasApp+'-DB-'+$Targetenv+'.'+$domain\r\n",
"$DBSPNs2Add\r\n",
""
],
"metadata": {
"azdata_cell_guid": "560c7245-ff94-42c0-b662-f13d3bfc58c2",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"source": [
"#Delegierung von einem NORMALEN ServiceKonto hin zu SPNs (Zelle 1)\r\n",
"#Import-Module ActiveDirectory \r\n",
"$Account = \"MyNormalSvcAccount\"\r\n",
"$mySvcAcc = Get-ADUser -Identity $Account\r\n",
"#Was ist bisher gesetzt?\r\n",
"#Get-ADUser -Identity $Account -Properties * |Select-Object displayname -ExpandProperty msDS-AllowedToDelegateTo | Format-Table\r\n",
"<#\r\n",
"\r\n",
"$SPNS2AddDB = @() #Hier müssen einmal die Ziel SPNs eingepflegt werden, ordentlich arbeiten ;-) \r\n",
"$SPNS2AddDB += \"MSSQLSvc/blablabla.domain.local:1433\",\"MSSQLSvc/blablabla.domain.local\"\r\n",
"and so on\r\n",
"$SPNS2AddDB \r\n",
"#>\r\n",
"\r\n",
"$ASSPNs2Add #either filled manually or pick the result from previous cell\r\n",
"$DBSPNs2Add\r\n",
"\r\n",
"#Jetzt die \r\n",
"#bei Bedarf kann die ein oder andere Zeile auskommentiert werden, je nachdem was für Aliase gesetzt werden sollenDelegierung setzen:\r\n",
"Set-ADObject -Identity $mySvcAcc -Add @{\"msDS-AllowedToDelegateTo\"=$ASSPNs2Add } -Verbose -WhatIf #ACHTUNG! Whatif aktiv, keine Eintraege\r\n",
"Set-ADObject -Identity $mySvcAcc -Add @{\"msDS-AllowedToDelegateTo\"=$DBSPNs2Add } -Verbose -WhatIf #ACHTUNG! Whatif aktiv, keine Eintraege\r\n",
"\r\n",
""
],
"metadata": {
"azdata_cell_guid": "4b542e73-c34b-4027-9647-936f50e0876c",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"source": [
"#Kontrolle über gesetzte Delegierung\r\n",
"Get-ADUser -Identity $Account -Properties * |Select-Object displayname -ExpandProperty msDS-AllowedToDelegateTo | Format-Table"
],
"metadata": {
"azdata_cell_guid": "9d1bb6bb-114b-4af8-93b5-22fee6fb318f",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"source": [
"#Ähnlicher Code fuer ein (group)ManagedServiceAccount\r\n",
"#SPN SETZEN für\r\n",
"$MeinServiceKonto = \"MyManagedServiceAccount\"\r\n",
"#meine SPNs HIER AUF entsprechenden Service achten!!!\r\n",
"\r\n",
"$SPNS2AddAS = @()\r\n",
"$SPNS2AddAS += \"MSOLAPSvc.3/blablabla\"\r\n",
"$SPNS2AddAS\r\n",
"\r\n",
"\r\n",
"\r\n",
"$mySvcAcc = Get-ADServiceAccount -Identity $MeinServiceKonto #Anstelle von get-ADUser ist es jetzt einfach ADServiceAccount\r\n",
"$mySvcAcc.DistinguishedName\r\n",
"#SPN hinzufügen\r\n",
"Set-ADObject -Identity $mySvcAcc -Add @{\"ServicePrincipalName\"=$SPNS2AddAS} -Verbose #-WhatIf"
],
"metadata": {
"azdata_cell_guid": "c23d1b6b-6722-4452-9c20-adfc10aaf2eb",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"source": [
"# ComputerKonto Delegierung setzen\r\n",
"$comp2Edit = \"MyComputer\"\r\n",
"\r\n",
"#$mycompt = Get-ADComputer $comp2Edit -Properties servicePrincipalName \r\n",
"#$mycompt.servicePrincipalName\r\n",
"\r\n",
"#Get-ADcomputer $comp2Edit -Properties * |Select-Object displayname -ExpandProperty msDS-AllowedToDelegateTo | Format-Table\r\n",
"$ASSPNs2Add\r\n",
"$DBSPNs2Add\r\n",
"Set-ADComputer -Identity $comp2Edit -add @{\"msDS-AllowedToDelegateTo\"=$ASSPNs2Add} -Verbose -WhatIf\r\n",
"#Set-ADComputer -Identity $comp2Edit -add @{\"msDS-AllowedToDelegateTo\"=$DBSPNs2Add} -Verbose -WhatIf"
],
"metadata": {
"azdata_cell_guid": "41e962bf-e967-436e-b4fd-6fd75f133d6b",
"tags": []
},
"outputs": [],
"execution_count": null
},
{
"cell_type": "code",
"source": [
"# Kontrolle über gesetzte Delegierung. Es kann sein, dass die neue Delegierung nicht sofort angeziegt wird. Zelle einfach 30 Sek später nochmal ausführen\r\n",
"Get-ADcomputer $comp2Edit -Properties * |Select-Object displayname -ExpandProperty msDS-AllowedToDelegateTo | Format-Table"
],
"metadata": {
"azdata_cell_guid": "ed6ff91a-592f-4241-94e6-241ed98764c1",
"tags": []
},
"outputs": [],
"execution_count": null
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment