migRaven liest eigentlich nur Konten und Gruppen aus dem AD aus. Wenn man Server migrieren will, auf dem die Berechtigungen auf der Basis von lokalen Accounts erfolgt ist, dann müssen diese im Vorfeld erst in die DB von migRaven importiert werden. Dies ist in der Vergangenheit häufig auf NetApp Filer praktiziert worden.
Voraussetzung: migRaven Version 6.4.1848 vom 30.11.2018
Ziel: Migration aller serverlokalen Berechtigungsgruppen und Accounts in Domänenrechte übersetzen
Wie: migRaven Redesignprojekt mit aktivierter Flatten Funktion.
Voraussetzung: es müssen die Server lokalen Gruppen mit ihren Mitgliedern vorher in die migRaven DB importiert werden.
Für Windows Server gibt es das untere Script. Für Netapps müssen die NetApp Powershell Tools genutzt werden.
Ergebnis: neue Domänen Berechtigungsgruppen, die die User flach enthalten. Wenn vorher auch D-Gruppen berechtigt waren, werden diese auch geflattet. Wenn man dies nicht möchte, kann man die Gruppen anhand ihrer Eigenschaft im Folgenden Key ausschließen:
Anpassung der c:\program files\migraven\migraven.exe.config
Ohne Ausschluss
<add key=“Flatten“ value=“y.type=’person‘ and y.isactive=’True‘ “ />
Mit Ausschluss von bestimmten Gruppen:
<add key=“Flatten“ value=“y.type=’person‘ and y.isactive=’True‘ and not (y. userprincipalname =~‘.*@ads0003.*‘ or y. userprincipalname =~‘.*@ADS0003.*‘)“ />
Exportieren der CSV-Dateien für die Serverlokalen Gruppen:
Mit diesem Script werden alle Serverlokalen Gruppen auf Windows ausgelesen und dann die Member ermittelt
$Computer = "SERVER"
$gruppen = get-wmiobject win32_group -filter "LocalAccount='True'" -ComputerName $Computer
foreach($groupName in $gruppen){
$Gname = $groupName.Name
#$Gname
$Group= [ADSI]"WinNT://$Computer/$Gname,group"
#$Group
$members = $Group.psbase.Invoke("Members")
$name = $members | ForEach-Object { $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) }
if($groupName.Description -eq "" )
{$groupName.Description = "leer" }
[System.Guid]::NewGuid().ToString() + "t" + $groupName.SID + "
t" + $groupName.Name + "t" + $Computer + "
t" + $groupName.Description | out-file -filePath "c:\temp\lokaleGruppen.csv" -Append
#$name
#$members
foreach ($n in $name){
if ( $n.ToString() -notcontains "System." ) {
write-host $n
$memb = (New-Object System.Security.Principal.NTAccount($n)).Translate([System.Security.Principal.SecurityIdentifier]).value
$groupName.SID + "," + $memb | out-file -filePath "c:\temp\MemberGruppen.csv" -Append
}
}
}
Es werden 2 CSV erzeugt, die dann wiederum über den CSV Import nach migRaven importiert werden
Entfernen der verwaisten ACEs vor dem ausführen der abschliessenden Scripts mit Ausführen von :
MATCH (n:ADAccount) where n.objectSID ends with ‚-1009‘ detach delete n (für alle betroffenen ObjectIDs)
MATCH (n:ACE) where not (n)-[:rel_ace]->() detach delete n ) für alle in der Datenbank
Aus der CSV müssen alle „build-in“ Einträge entfernt werden!
LOAD CSV FROM ‚file:///C:/temp/lokaleGruppen.csv‚ AS line FIELDTERMINATOR ‚\t‘ with line,
‚merge (l:ADAccount {objectGUID:“‚ + line[0] + ‚“ }) on create set l.objectSID=“‚ + line[1] +'“ set l.name=“‚+ line[2] + ‚“ set l.domain=“‚ + line[3] + ‚“ set l.commonsid=“0″ set l.type=“group“ set l.sAMAccountName=“‚ + line[2] + ‚“ set l.cn=“‚+ line[2] +'“ set l.distinguishedname=““ set l.isactive=“True“ set l.department=““ set l.description=“‚+ line[4] + ‚“ set l.displayname=““ set l.givenName=““ set l.grouptype=““ set l.sn=““ set l.sAMAccountType=“SAM_NON_SECURITY_GROUP_OBJECT“ set l.ad=“1″ set l.grouptype=“Universal_Security_Group“ set l.adspath=“LDAP://‘ + line[3] + ‚/CN=‘ + line[2] + ‚,CN=Users,DC=‘ + line[3] + ‚“‚ as cypher CALL apoc.cypher.doIt(cypher,{}) yield value return value
Optional, wenn die Rechte nach dem Scan nicht angezeigt werden. Dann muss die ACE mit dem AD Account verbunden werden:
USING PERIODIC COMMIT 1000 LOAD CSV FROM ‚file:///c:/temp/lokaleGruppen.csv‚ AS line FIELDTERMINATOR ‚\t‘ match (a:ACE)-[:rel_right0]->(o:ResourceSearch) where a.sid=line[1] with distinct a, line match (b:ADAccount) where b.objectSID=line[1] merge (a)-[:rel_ace]->(b)
USING PERIODIC COMMIT 1000 LOAD CSV FROM ‚file:///c:/temp/MemberGruppen.csv‚ AS line FIELDTERMINATOR ‚,‘ match (l:ADAccount {objectSID: line[0]}) match (d:ADAccount {objectSID:line[1]}) merge (l)-[:rel_member]->(d)
Wichtig: Damit lokale Konten in der Tabelle angezeigt werden
Es ist zu überprüfen ob die Parameter bei den übernommenen Konten vollständig gesetzt sind.
Dazu insbesondere der Wert adspath
An dieser Stelle sollte die Domäne stehen oder der Wert der unter domain hinterlegt ist.
Am Beispiel einer IP sollte die Cypher-Abfrage/ Änderung des adspath in der Datenbank so ausgeführt werden:
match (n:ADAccount) where n.domain=“10.116.9.38″ set n.adspath=“10.116.9.38″ return n