8 Replies Latest reply on Nov 18, 2014 5:21 AM by ChristianPauli

    [SOLVED] Powershell - move-adobject über DSM

    ChristianPauli Apprentice
      Hallo Zusammen,

      ich bin ganz neu hier im Forum und auch noch ziemlich neu in der DSM Welt (habe diese Woche die ersten Gehversuche unternommen. Demnach hoffe ich, dass Ihr mir meine ggf. einfachen Fragen verzeiht. Weiterhin würde ich mich freuen, wenn Ihr bei Antworten auf DSM spezifische Abkürzungen verzichten würdet und es "sprechender" formulieren könntet :-)

      Zur Umgebung:

      Wir sind auf Version 7.02.003.2582 mit DSM Patch-Version: 2599

      Nun zu meiner Frage.

      Ich würde gerne am Ende jeder Installation eines neuen Computers, diesen in eine vordefinierte Active Directory OU verschieben.

      Dafür wurde bei uns in der DSM Umgebung schon eine Variable "MachineObjectOU" erstellt. Der Wert der Variable wird je nach Lokation und Art des Computers vorgegeben.

      z.B. ein Notebook am Standort Starnberg erhält den Wert:

      OU=Notebooks,OU=Computers,OU=Starnberg,OU=Firma,DC=Domain.DC=net

      Über einen Blog Eintrag von Frank Scholer (auch hier im Forum), bin ich auf die Powershell Funktionalität in DSM gestoßen und habe mich gleich angeschickt ein Powershellscript für meine Aufgabe zu erstellen.

      eScript Code:


      !Define variables
      Set('_computer','%CurrentComputer.Object.Name%')
      Set('_target','%CurrentComputer.Var.NetworkInformation.MachineObjectOU%')
      !
      !Invoke Powershell script
      CallScript('.\Extern$\move-ad-object.ps1','')


      Powershell Code


      Import-Module activedirectory

      $computer = Get-NiVar "_computer"
      $target = Get-NiVar "_target"

      Get-ADComputer $computer  | Move-ADObject -TargetPath $target


      Das Script funktioniert, wenn es auf einem Computer ausgeführt wird, der a) die ActiveDirectory Erweiterung installiert hat und b) das Script von einem Anwender ausgeführt wird, der das Recht hat diese Operation im AD durchzuführen

      Wenn ich das Ganze aber jetzt bei einem neu aufgesetzten PC ausführen möchte, sind beide Vorraussetzungen (a+b) aber auf dem System nicht verfügbar und ich erhalte immer Fehlermeldungen im Log:


      11:41:19.208 E         Error (Module:xniTools, Severity:0x0b): Execution of NIL_CallScript with script \\ssta-netap2.paricorp.net\enteo$\Work\Master\Projects\110057\Extern$\move-ad-object.ps1 failed
      Function failed during execution. (0x0000065b)
      11:41:21.502 E         Warning (Module:xniTools, Severity:0x03): Error sending E-mail


      Das ist alles auch soweit klar denke ich, dass zum einen die Execution Policy auf restricted steht und sowohl der User als auch die AD Snapins auf diesen System nicht vorhanden sind.

      Jetzt wäre meine Frage, hat jemand von euch schon selbst soetwas erfolgreich umgesetzt und wenn ja wie? Gibt es die Möglichkeit dieses Script auf einem System auszuführen wo die Vorraussetzungen erfüllt sind (z.B. Server).

      Vielen Dank schon vorab für eure Unterstützung.

      PS: Ja man könnte die Variable MachineObjectOU dazu verwenden, um schon während der Installation des OS über die Unattend.xml den Domain Join auf eine Bestimmte OU zu lenken, dies geht bei uns aber leider nicht, da auf den Ziel OU's GPO's sind die u.a. dafür sorgen, dass per Bitlocker die C: Partition verschlüsselt wird. Dabei wird fast der gesamte Festplattenplatz reserviert und die Pakete laufen während der Installation auf Fehler.
        • 1. Re: [SOLVED] Powershell - move-adobject über DSM
          NicoS1 Master
          Hallo Christian,

          ich nutze auch regelmäßig PowerShell Scripte innerhalb von DSM... aber... für diese Aufgabe würde ich persönlich einfach einen RunAs mit DSMove machen.

          dsmove "cn=%computername%,ou=bitlocker,dc=Firma,dc=local" -newparent "ou=Buchhaltung,dc=Firma,dc=local"

          evtl. LDAP Queries kannst du ohne AD Erweiterungen für Powershell auch über VBScript oder direkt über WMI machen, wobei ich VBScript bevorzuge, da WMI Queries über DSM und LDAP evtl. sehr lange laufen.

          Gruß
          • 2. Re: [SOLVED] Powershell - move-adobject über DSM
            ChristianPauli Apprentice
            Hallo Nico,

            vielen Dank für deine schnelle Rückmeldung.

            Könntest du deine Vorgehensweise bitte etwas genauer erläutern? Wie gesagt ich bin noch wirklich neu in der DSM Welt und habe den Befehl "dsmove" z.B. in einem eScript garnicht zur Auswahl. Weiterhin wollte ich im Script auch nicht mit den genauen OU Locations arbeiten, sondern mit einer Variable, die eh schon vorhanden ist "MachineObjectOU" siehe meinen ersten Scriptblock.

            Könntest du mir ggf. einen Beispiel Code, wie er in einem DSM Paket aussehen müsste zeigen? Oder ist dieses "dsmove" kein DSM spezifisches Tool?

            ---EDIT---

            Ok ich habe mittlerweile rausgefunden, das dsmove kein DSM Programm ist, sondern ein CLI Programm was bei den Windows Server Installationen dabei ist. Soweit funktioniert das auch bei einem Test auf einen Adminpc.

            Nun habe ich aber das Problem, dass das Script ja nicht auf einem solchen Adminpc sondern auf den PC der installiert wurde ausgeführt werden soll. Dieser hat das Tool dsmove nicht mit an board. Weiterhin habe ich dann immer noch das Problem, dass dsmove die Variable "MachineObjectOU" aus DSM nicht kennt. Kann ich das Script sowohl auf einem "Server" ausführen, als auch die DSM Variablen übergeben? Wenn ja wie geht das denn?

            Viele Dank und schöne Grüße
            Christian
            • 3. Re: [SOLVED] Powershell - move-adobject über DSM
              NicoS1 Master
              Hallo Christian,

              dsmove ist eine exe Datei, die du im Windows System32 Verzeichnis findest. Einfach über die DOSBOX Aufrufbar. dsmove /? ist ein Standardbestandteil von Windows

              Das Einzige was da unterschiedlich wäre ist, dass du den DistinguishedName des Computers brauchst, anstatt nur dem Computernamen. Wenn die OU, in die du einen Computer anlegst aber immer die gleiche ist kannst du den recht Statisch zusammenbauen.

              Set('_computer','CN=%CurrentComputer.Object.Name%,OU=Install,DC=Firma,DC=lokal')

              (Achtung, falls hier im Beitrag ein Leerzeichen reinrutscht, das liegt am Forum. Die Boardsoftware hier haut nach einer bestimmten Anzahl zusammenhängender Zeichen eine Leerstelle rein, nicht irrtieren lassen)

              Target ist ja schon die Ziel OU:
              Set('_target','%CurrentComputer.Var.NetworkInformation.MachineObjectOU%')

              Jetzt nimmst du den RunAs Befehl, hinterlegst dort einen User mit den Rechten in der AD Objekte zu verschieben und startest die Datei %WINSYSDIR%\dsmove.exe mit den Parametern:

              "%_Computer%" -newparent "%_target%"
              • 4. Re: [SOLVED] Powershell - move-adobject über DSM
                ChristianPauli Apprentice
                Hallo Nico,

                vielen Dank für deine Hilfe, so sieht das schon alles runder aus, leider ist die dsmove.exe auf keinen unserer Rechner vorhanden (6 verschiedene geprüft). Also dachte ich mir ok, gibt es nicht also kopier ich sie vorher rüber. Die Datei ins Extern$ kopiert und wiefolgt im script aufgerufen:

                 

                Copy('.\Extern$\dsmove.exe','%WINSYSDIR%')/U/TW
                !
                !Define variables
                Set('_computer','%CurrentComputer.Object.Name%')
                Set('_target','%CurrentComputer.Var.NetworkInformation.MachineObjectOU%')
                !
                If Exist('%WINSYSDIR%\dsmove.exe')
                RunAs('%WINSYSDIR%\dsmove.exe','"%_Computer%" -newparent "%_target%"','user','pw','1',WaitForExecution+UndoneContinueParentScript)



                Das Script wird ausgeführt und der bobbel geht auf grün. Leider ist weder die dsmove.exe kopiert, noch das Script logischerweise erfolgreich ausgeführt worden.

                Ich glaube ich lasse es erstmal für Heute und mach Montag weiter. Vielleicht hast du ja noch ein Tipp, warum die Datei nicht kopiert wird.
                • 5. Re: [SOLVED] Powershell - move-adobject über DSM
                  NicoS1 Master
                  Mea culpa, ich glaube die dsmove kommt mit den RSAT Tools.

                  Kopiert wird Sie glaube ich nicht, weil, wenn ich das richtig Sehe der Befehl nur Computerbezogen ausgeführt ist. Flagge ihn mal als "Computerbezogen als Service".

                  Gruß
                  • 6. Re: [SOLVED] Powershell - move-adobject über DSM
                    ChristianPauli Apprentice
                    Hallo Nico,

                    so ich habe es mittlerweile geschafft, dass auch endlich die "dsmove.exe" kopiert wird. Leider ist es aber wohl so, dass ohne eine Installation des RSAT auf dem Windows 7 Client die Ausführung der "dsmove.exe" nichts bringt. Wenn ich das lokal am Client versuche, produziert der Aufruf von dsmove keine Ausgabe. Nach Recherche im Netz hat jemand genau dasselbe Thema wie ich und dasselbe Ergebnis gehabt.

                    [URL="https://social.technet.microsoft.com/Forums/windowsserver/en-US/84c09ffc-2a47-41de-b164-202f04b5938f/dsmove-command-produces-no-output?forum=winservergen"]dasselbe Problem

                    Ihm wurde empfohlen entweder das RSAT auf den Clients zu installieren oder das [URL="http://www.joeware.net/freetools/tools/admod/index.htm"]AdMod zu nutzen. Jetzt stell ich mir die Frage, ob es aus Security Gründen dagegen spricht über all das RSAT zu installieren oder ob ich mal versuchen sollte das AdMod zum laufen zu bringen?

                    Was meinst du / ihr?

                    Viele Grüße
                    Christian
                    • 7. Re: [SOLVED] Powershell - move-adobject über DSM
                      NicoS1 Master
                      Unter diesem Umständen würde ich doch nochmal zurück zu PowerShell gehen und es mit einer Remote Session zum Server machen... circa so:

                      $server = "DomainController"
                      $session = new-pssession -computer $server -Authentication Kerberos
                      Invoke-Command -session $session -script { Import-Module ActiveDirectory }
                      Import-PSSession $Session -AllowClobber -DisableNameChecking | Out-Null


                      Das PowerShell ausgeführt mit einem User der Berechtigungen auf den DC hat... und dann hast du in deiner Sitzung Zugriff auf die AD Commandlets auf dem Server, ohne diese lokal zu installieren... (nach dem der Teil oben ausgeführt worden ist)

                      DomainController sollte glaube ich mind. ein 2008er sein.
                      • 8. Re: [SOLVED] Powershell - move-adobject über DSM
                        ChristianPauli Apprentice
                        Hallo Nico,

                        ich danke dir für den Input. Ich habe mir das mit den Powershell und der Remoteausführung etwas genauer angeschaut und kann diese Variante leider nicht verwenden, da dies von unserem Domain Administrator nicht gewünscht ist. Demnach habe ich mich nun mit einer anderen Vorgehensweise beholfen, die jetzt in mehreren Tests super funktioniert hat, ohne dass ich auf dem Client irgendwelche extra Voraussetzungen schaffen musste.

                        Ich habe mir das Tool "[URL="http://www.joeware.net/freetools/tools/admod/"]Admod" heruntergeladen. Dieses habe ich im Paket im Ordner Extern$ platziert. Im Script rufe ich dann das Tool mit RunAs auf:


                        RunAs('.\Extern$\admod.exe','-b CN=%COMPUTERNAME%,CN=Computers,DC=paricorp,DC=net -move %CurrentComputer.Var.NetworkInformation.MachineObjectOU%','Domain\username','passwort','1',WaitForExecution+UndoneContinueParentScript)/TS


                        Der Parameter Teil der Anweisung setzt sich wie folgt zusammeN:

                        -b <Distinguishedname des Computers im AD inklusive OU> -move <Ziel OU>

                        Der Befehl wird als Service Computerbezogen geflaggt.

                        Somit ist meine Ursprüngliche Anforderung erfüllt und einsatzfähig.

                        Nochmals vielen Dank für deine Tipps und Unterstützung.

                        Vielleicht ist diese Lösung ja ggf. für andere auch noch hilfreich.

                        Viele Grüße
                        Christian