none
AltSecurityIdentities RRS feed

  • Frage

  • Hallo,

    wir sind momentan am zusammenbauen eines Scriptes, bzw. eine Befehlskette mittels PowerShell für einen Kunden.

    Wir legen mittes import-csv 5000 Computerkonten an und über set-adcomputer entsprechend setzen wir den serviceprincipal name.

    Was noch fehlt (in der GUI geht so: Rechtsklick Computer --> Namenszuordnung -> und bei X509-Certifikate --> wird das entsprechende ComputerZertifikat hinzugefügt)

    Über die PowerShell heisst das Feld altSecurityIdentities, aber dieses Feld ist nicht ansprechbar über Shell.

    Gibt es da eine Möglichkeit daran zu kommen und evtl. mittels Befehl/Script die jeweiligen Zertifikate den Computerkonten zuzuweisen?

    Leider findet man nicht wirklich was hierzu.

    Manuell über die Gui wäre das ein enormer Aufwand für 5000 Clients.

    Danke für die Unterstützung.

    Donnerstag, 26. Juli 2012 11:00

Antworten

  • Du kannst in PowerShell den [ADSI] Privider nutzen um dieses VB Script umzusetzen:
    http://www.tech-archive.net/Archive/Windows/microsoft.public.windows.server.active_directory/2005-08/msg00630.html

    Oder du nutzt ldifde.exe
    http://blogs.technet.com/b/askds/archive/2009/06/11/using-ldifde-to-perform-post-migration-clean-up-tasks.aspx


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Donnerstag, 26. Juli 2012 12:28
  • Ihr solltet das VBS nach PowerShell übersetzen !
    Die Pipeline gibt doch das neu angelegte Computer Objekt weiter zu Verarbeitung !!!

    Ich kann das hier nicht testen aber so etwa sollte es gehen!

    #konstante setzen (muss nicht sein man kann auch einfach 3 nehmen)
    Set-Variable ADS_PROPERTY_APPEND -option Constant -value 3
    
    
    Import-Csv "Datei".csv | foreach {New-ADComputer -Name $_.Name -Description $_.Description} | ForEach-Object {
    	
    	# Der Computer ist das Aktuelle Objekt in der Pipeline! Computer = $_
    	Write-Host $('Ich bearbeite nun den Computer: ' + $_.Path)
    	$Computer = [ADSI]$_.Path
    	$Clientname = $Computer.CN
    	
    	
    	# Property altSecurityIdentities setzen PowerShell Version
    
    	$Array = @("X509:<I>DC=local,O=XXXX,OU=XX,CN=XXXX,E=XXXXX<S>DC=local,O=XXXX,OU=XX,CN=$Clientname")
    	$Computer.PutEx( $ADS_PROPERTY_APPEND,'altSecurityIdentities',$Array)
    	$Computer.SetInfo()
    }

    Wenn man die Pipeline richtig nutzt kann man sich das 2 malige einlesen der CSV auch sparen!
    Ebenso kann man die –ServicePrincipalNames gleich beim Anlegen des Computers mitgeben, hier spart man sich den Aufruf von Set-ADComputer !

    Set-ADComputer $_.Name -servicePrincialNames @{Add=$_.Host1,$_.Host2}
    
    #konstante setzen (muss nicht sein man kann auch einfach 3 nehmen)
    Set-Variable ADS_PROPERTY_APPEND -option Constant -value 3
    
    
    Import-Csv "Datei".csv | foreach {
        
        Write-Host $('Ich bearbeite nun den Computer: ' + $_.Name)
        
        $Computer = New-ADComputer -Name $_.Name -Description $_.Description -ServicePrincipalNames $_.Host1,$_.Host2
    		
    	$ADSIComputer = [ADSI]$_.Path
    	$Clientname = $Computer.CN
    	
    	
    	# Property altSecurityIdentities setzen PowerShell Version
    
    	$Array = @("X509:<I>DC=local,O=XXXX,OU=XX,CN=XXXX,E=XXXXX<S>DC=local,O=XXXX,OU=XX,CN=$Clientname")
    	$Computer.PutEx( $ADS_PROPERTY_APPEND,'altSecurityIdentities',$Array)
    	$Computer.SetInfo()
    }


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Donnerstag, 26. Juli 2012 15:31

Alle Antworten

  • Du kannst in PowerShell den [ADSI] Privider nutzen um dieses VB Script umzusetzen:
    http://www.tech-archive.net/Archive/Windows/microsoft.public.windows.server.active_directory/2005-08/msg00630.html

    Oder du nutzt ldifde.exe
    http://blogs.technet.com/b/askds/archive/2009/06/11/using-ldifde-to-perform-post-migration-clean-up-tasks.aspx


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Donnerstag, 26. Juli 2012 12:28
  • Hallo,

    hmm das klingt super, steht irgendwo wie das Kommando lautet für powershell und vbscript (bin leider hier in dem nicht so drin)

    theoretisch müsste ich dem script irgendwie noch mitteilen wie er die CN Felder austauscht jedesmal für nen anderen Client, bzw. die daten vielleicht direkt aus der csv ziehen kann..

    Mit einem habe ich es grad mal getestet und funktioniert, aber mittels script direkt und nur einem Client..

    Donnerstag, 26. Juli 2012 13:09
  • Tschuldigung ich verstehe deine Frage nicht ganz !
    In dem Moment wo ihr mit eurem Script das User Objekt anlegt, wird doch auch der CN LDAP Pfad erzeugt!
    Dieser wird dann einfach verwendet!

    Ansonnsten müst ihr mit dem [Adsisearcher]....FindOne() den User suchen lassen. Im ergebniss habt ihr dann den LDAP Pfad des Users den Ihr dann wieder verwenden könnt.


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Donnerstag, 26. Juli 2012 13:56
  • Sorry,

    hab mich falsch ausgedrückt, sorry

    also mit den beiden Befehlen über die Powershell laden wir die Daten aus der excel-csv rein.

    import-csv "Datei".csv | foreach {New-ADComputer -Name $_.Name -Description $_.Description}

    import-csv "Datei.csv | foreach {Set-ADComputer $_.Name -servicePrincialNames @{Add=$_.Host1,$_.Host2}}

    Wo Host1 und Host2 entsprechend für die Werte in der Tabelle stehen für den SPN

    Das heisst damit wären die erstmal angelegt und fertig mit PrincipalName. Aber was mittels PowerShell nicht ansprechbar ist, ist altSecurity Identities.

    UNd mit dem VB Script würde es gehen, ein bestehenden Computer konnt ich damit testen mit dem hier:

    Const ADS_PROPERTY_APPEND = 3
    Set oUser = GetObject ("LDAP://CN=HIER CLIENTNAME,CN=Computers,dc=XXXX,dc=local")
    oUser.PutEx ADS_PROPERTY_APPEND, "altSecurityIdentities", _
    Array("X509:<I>DC=local,O=XXXX,OU=XX,CN=XXXX,E=XXXXX<S>DC=local,O=XXXX,OU=XX,CN=HIER CLIENTNAME")

    Wobei bei "Hier ClientName" irgendwie der Wert "Name aus der csv ausgelesen werden sollte und dann hier eingefügt wird, automatisch, damit er das AD entsprechend füllt.

    So war das gemeint, ich hoffe es ist verständlich.

    Donnerstag, 26. Juli 2012 14:30
  • Ihr solltet das VBS nach PowerShell übersetzen !
    Die Pipeline gibt doch das neu angelegte Computer Objekt weiter zu Verarbeitung !!!

    Ich kann das hier nicht testen aber so etwa sollte es gehen!

    #konstante setzen (muss nicht sein man kann auch einfach 3 nehmen)
    Set-Variable ADS_PROPERTY_APPEND -option Constant -value 3
    
    
    Import-Csv "Datei".csv | foreach {New-ADComputer -Name $_.Name -Description $_.Description} | ForEach-Object {
    	
    	# Der Computer ist das Aktuelle Objekt in der Pipeline! Computer = $_
    	Write-Host $('Ich bearbeite nun den Computer: ' + $_.Path)
    	$Computer = [ADSI]$_.Path
    	$Clientname = $Computer.CN
    	
    	
    	# Property altSecurityIdentities setzen PowerShell Version
    
    	$Array = @("X509:<I>DC=local,O=XXXX,OU=XX,CN=XXXX,E=XXXXX<S>DC=local,O=XXXX,OU=XX,CN=$Clientname")
    	$Computer.PutEx( $ADS_PROPERTY_APPEND,'altSecurityIdentities',$Array)
    	$Computer.SetInfo()
    }

    Wenn man die Pipeline richtig nutzt kann man sich das 2 malige einlesen der CSV auch sparen!
    Ebenso kann man die –ServicePrincipalNames gleich beim Anlegen des Computers mitgeben, hier spart man sich den Aufruf von Set-ADComputer !

    Set-ADComputer $_.Name -servicePrincialNames @{Add=$_.Host1,$_.Host2}
    
    #konstante setzen (muss nicht sein man kann auch einfach 3 nehmen)
    Set-Variable ADS_PROPERTY_APPEND -option Constant -value 3
    
    
    Import-Csv "Datei".csv | foreach {
        
        Write-Host $('Ich bearbeite nun den Computer: ' + $_.Name)
        
        $Computer = New-ADComputer -Name $_.Name -Description $_.Description -ServicePrincipalNames $_.Host1,$_.Host2
    		
    	$ADSIComputer = [ADSI]$_.Path
    	$Clientname = $Computer.CN
    	
    	
    	# Property altSecurityIdentities setzen PowerShell Version
    
    	$Array = @("X509:<I>DC=local,O=XXXX,OU=XX,CN=XXXX,E=XXXXX<S>DC=local,O=XXXX,OU=XX,CN=$Clientname")
    	$Computer.PutEx( $ADS_PROPERTY_APPEND,'altSecurityIdentities',$Array)
    	$Computer.SetInfo()
    }


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Donnerstag, 26. Juli 2012 15:31
  • Hi,

    also ich hab beide Varianten getestet, null erfolg, Variante eins wird gleich gar nicht ausgeführt, bei Variante 2: arbeit er zwar, aber bringt den fehler:

    Ich bearbeite nun den Computer: P00809FA49AA8
    Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen.
    Bei C:\Users\Administrator\Desktop\testps-2.ps1:13 Zeichen:17
    +     $Computer.PutEx <<<< ( $ADS_PROPERTY_APPEND,'altSecurityIdentities',$Arra
    y)
        + CategoryInfo          : InvalidOperation: (PutEx:String) [], RuntimeExce
       ption
        + FullyQualifiedErrorId : InvokeMethodOnNull

    Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen.
    Bei C:\Users\Administrator\Desktop\testps-2.ps1:14 Zeichen:19
    +     $Computer.SetInfo <<<< ()
        + CategoryInfo          : InvalidOperation: (SetInfo:String) [], RuntimeEx
       ception
        + FullyQualifiedErrorId : InvokeMethodOnNull

    und genommen hab ich nun das so:

    Import-Csv c:\Mac.csv | foreach {
        
        Write-Host $('Ich bearbeite nun den Computer: ' + $_.Name)
        
        $Computer = New-ADComputer -Name $_.Name -Description $_.Description -ServicePrincipalNames $_.Host1,$_.Host2 
        $ADSIComputer = [ADSI]$_.Path
        $Clientname = $Computer.CN
        $Array = @("X509:<I>DC=local,O=xx,OU=xx,CN=xx,E=xx<S>DC=local,O=xx,OU=tk,CN=$Clientname")
        $Computer.PutEx( $ADS_PROPERTY_APPEND,'altSecurityIdentities',$Array)
        $Computer.SetInfo()
    }


    • Bearbeitet ag_82 Freitag, 27. Juli 2012 11:26
    Freitag, 27. Juli 2012 11:26
  • Ich kann hier keine Computer mit den MS Modul anlegen. Wir benutzen andere Techniken.
    Ich hatte ja geschrieben das ich die Scripte Quasi Blind schreiben musste, da ich Sie nicht ausprobieren kann.

    Der Fehler taucht in der Zeile 13 Zeichen 17 auf.

    >>>> Sie können keine Methode für einen Ausdruck mit dem Wert NULL aufrufen.
    Das heisst es ist vorher etwas schief gegangen und das Computer Objekt ist leer.
    Dies wiederum deutet darauf hin, das ein Fehler beim anlegen des Computer mit dem Namen P00809FA49AA8 passiert ist! 

    Die grundlegenen Technik des Debugging kann ich dir schlecht hier im Forum vermitteln!
    Ein GUTES Buch und/oder ein Lehrgang sind da unersetzbar!

    Ich habe sehr viele PowerShell Bücher gelesen das beste ist dieses:
    Windows PowerShell 2.0 - Das Praxisbuch: Einführung und Lösungen für Windows-Administratoren
    Dr. Holger Schwichtenberg
    Addison-Wesley Verlag


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Freitag, 27. Juli 2012 12:37