Arbeitsgruppe ändern

  • Ich selber weiß nicht wie man das macht, da ich mich nicht mit WMI auskenne, aber es gibt ein WMI-Objekt:

    In Win32_Computersystem der Eintrag Domain sollte dafür zuständig sein. Bin sehr an einer Lösung interessiert :D

    Grüße,
    Buffo

  • Sieh dir mal die Datei C:\WINDOWS\Debug\NetSetup.LOG an ...

    Ich habe mal ein bisschen hin und her gespielt (ARBEITSGRUPPE; ARBEITSGRUPPECB)


    NetSetup.LOG

    Spoiler anzeigen

    Die Datei C:\WINDOWS\system32\config\SECURITY.LOG wird auch verändert, wenn der Name geändert wird, lässt sich aber nicht öffnen !

    Und natürlich muss ein Neustart erfolgen, damit die Änderungen übernommen werden ...


    Gruß
    Greenhorn


    • Offizieller Beitrag

    Hallo

    Vielen dank für diese Lösungsvorschläge :)

    @Buffo: Ja, damit kann man aufjedenfall die Domain/Arbeitsgruppe auslesen, aber leider nicht schreiben ;) Ich hab es übrigends mit dem Objekt ""WinNT:" gemacht:

    Spoiler anzeigen
    [autoit]

    $oWinNT = ObjGet("WinNT:")
    For $DomainObj In $oWinNT
    MsgBox(0,@OSVersion,'Willkommen in der Arbeitsgruppe "'&$DomainObj.Name&'"')
    Next

    [/autoit]

    Greenhorn: Mh, aber das ist doch nur eine LOG Datei? Also sie schreibt doch nur auf was geändert wurde oder?

    Mfg Spider

  • Ja, aber irgendwo muss es ja bleiben ...

    Habe mit FileInspector 'gescannt' als ich die Namen änderte...
    NetSetup.LOG und SECURITY.LOG waren die einzigen Dateien die verändert wurden.

    Und die Registry hane ich auch verglichen (vorher-nachher), da wurde nichts verändert.
    Ich fand dort auch keine Schlüssel oder Werte die sich darauf beziehen könnten ...


  • Ich habe hier gerade ein VB-Script gefunden, das u. a. die Arbeitsgruppe ändern können soll. Vielleicht kannst du dir ja daraus was für AutoIt abgucken:

    Spoiler anzeigen

    Quelle: Tek-Tips

    Grüße,
    Buffo

    • Offizieller Beitrag

    Hallo

    Ja, hier wird es mit NetDom gemacht. Habe ich auch schon Probiert, kriege aber immer Folgende Fehlermeldung:

    Spoiler anzeigen
    Code
    C:\>NETDOM JOIN \\max-01 /Domain:WORKGR
    Die angegebene Domõne ist nicht vorhanden oder es konnte keine Verbindung hergestellt werden.
    
    
    The command failed to complete successfully.

    Naja, die Arbeitsgruppe "WORKGR" existiert tatsächlich nicht, aber wie kann ich denn mit NetDom eine erstellen?

    Wenn ich es mit ADD probiere kommt folgende Fehlermeldung:

    Spoiler anzeigen
    Code
    C:\>netdom add \\max-01 /domain:workgrp
    Die Syntax f³r den Dateinamen, Verzeichnisnamen oder die Datentrõgerbezeichnung
    ist falsch.
    
    
    The command failed to complete successfully.

    Vielen dank nochmal :)

    Mfg Spider

  • Habe mir das gerade nochmal genauer angesehen. Leider kommt bei mir beim Gebrauch von Netdom.exe immer nur die Fehlermeldung "Der RPC-Locator ist nicht verfügbar", daher kann ich nicht testen.

    Laut Microsoft Support Tools gibt es die Option /JOINWORKGROUP:

    Zitat

    Netdom.exe
    Sie können das Befehlszeilenprogramm "Netdom.exe" verwenden, um einen Computer zu einer Domäne hinzuzufügen oder ein Computerkonto zu verwalten.
    • Die Option /JOINDOMAIN fügt einen Computer zu einer Domäne hinzu.
    • Die Option /JOINWORKGROUP fügt einen Computer zu einer Arbeitsgruppe hinzu.
    • Die Option /RENAME bennent einen Computer in der Domäne um.

    Kann ich leider nirgend in der Hilfe finden. Bin ich blind?

    Grüße,
    Buffo

  • moin moin!

    Hatte gerade erfolglos versucht es über die Registry zu machen nur scheint die Arbtitsgruppe nicht eingetragen zu werden! X(

    Für den ComputerNamen hatte ich es geschafft:

    Spoiler anzeigen
    [autoit]

    $NewName = "Wunschname"
    $OldName = @ComputerName

    [/autoit] [autoit][/autoit] [autoit]

    RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ComputerName\ComputerName", "ComputerName", "REG_SZ", $NewName)
    RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ComputerName\ComputerName", "ActiveComputerName", "REG_SZ", $OldName)
    RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters", "NV Hostname", "REG_SZ", $NewName)
    RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName", "ComputerName", "REG_SZ", $NewName)
    RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName", "ComputerName", "REG_SZ", $OldName)
    RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters", "NV Hostname", "REG_SZ", $NewName)

    [/autoit]

    :!: "If you make something idiot proof, someone will invent a better idiot." :!:

  • Tagchen
    GtaSpider

    Netdom Syntax
    netdom join DeinComputerName(Für local ohne UNC-Pfad) /w:NeueArbeitsgruppe(/w: sollte Parameter "Workgroup" definieren, für Domain steht /d:NeueDomain)

    Netdom für W2K(W2K-SupportTools) funktionier nicht mit Parameter /w:, im XP kann nicht das momentan nicht testen.
    ????

    - MfG OpaEd

  • opaed: Bei mir wird dann immer die Hilfe für den Aufruf angezeigt, also ein Zeichen dafür, dass die Syntax falsch ist.

    Einmal editiert, zuletzt von Buffo (14. November 2007 um 13:50)

    • Offizieller Beitrag

    Hallo

    Super, vielen Dank. Dann hatte ich einfach die Falsche Version von NetDom.exe erwischt :/

    Für alle die, die es interesiert, hier ist eine Kleine UDF (Downloadet die NetDom.exe automatisch wenn sie nicht existiert):

    Spoiler anzeigen
    [autoit]

    MsgBox(0,"",_ChangeWorkgroup("ARBEITSGRUPPE"))

    [/autoit] [autoit][/autoit] [autoit]

    Func _ChangeWorkgroup($sWorkgroup,$sComputername = @ComputerName)
    If Not FileExists("netdom.exe") Then
    If MsgBox(20,"","NetDom.exe not founded! Downlad?") = 7 Then Return SetError(1,0,0)
    If @ProcessorArch <> "X86" Then Return SetError(1+MsgBox(16,"","This will only work with an X86 OS. You running "&@OSVersion&" "&@ProcessorArch&"!"),0,0)
    TrayTip("Please Wait","Downloading NetDom.exe",4)
    InetGet("ftp://ftp.microsoft.com/reskit/nt4/x86/netdom_x86.exe","netdom_inst.exe")
    $pid = Run("netdom_inst.exe","",@SW_HIDE)
    WinWait("WinZip Self-Extractor [netdom_inst.exe]")
    ControlSetText("WinZip Self-Extractor [netdom_inst.exe]","","Edit1",@ScriptDir)
    ControlClick("WinZip Self-Extractor [netdom_inst.exe]","","Button3")
    WinWait("WinZip Self-Extractor","2 file(s) unzipped successfully")
    ProcessClose($pid)
    FileDelete(@ScriptDir&"\netdom_inst.exe")
    TrayTip("","",1)
    EndIf
    $pid = Run("netdom.exe member "&$sComputername&" /joinworkgroup "&$sWorkgroup,"",@SW_HIDE,2)
    While ProcessExists($pid)
    Sleep(100)
    WEnd
    Return StdoutRead($pid)
    EndFunc

    [/autoit]

    Ich hoffe diese Funktion hilft den ein oder anderen :)

    Mfg Spider

    EDIT: Grade etwas gefunden, keine Ahnung ob es auch für Arbeitsgruppe geht, ist aber halt ohne Netom sodnern mit Object's..: KLICK MICH

  • Hier mal noch eine Möglichkeit ohne Netdom oder COM-Objekte:


    Spoiler anzeigen
    [autoit]

    If _ChangeWorkgroup("Test") Then MsgBox(0,"", "Änderung der Arbeitsgruppe erfolgreich!")

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _ChangeWorkgroup()
    ; Description: Change computer´s workgroup
    ; Parameter(s): $WGName = new workgroup name
    ; Requirement(s): Netapi32.dll
    ; Return Value(s): On Success - 1
    ; On Failure - 0 and sets @ERROR = 1
    ; Author(s): [email='AspirinJunkie@german-nlite.de'][/email]
    ; Note(s): may require reboot to take effect
    ;
    ;===============================================================================
    Func _ChangeWorkgroup($WGName)
    Local $struct[2], $Ptr[2]
    $struct[0] = DllStructCreate("wchar[100]")
    If @error Then Return SetError(1, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $struct[1] = DllStructCreate("wchar[1]")
    If @error Then Return SetError(1, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($struct[0], 1, $WGName)
    If @error Then Return SetError(1, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($struct[1], 1, '')
    If @error Then Return SetError(1, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $Ptr[0] = DllStructGetPtr($struct[0])
    $Ptr[1] = DllStructGetPtr($struct[1])

    [/autoit] [autoit][/autoit] [autoit]

    DllCall('Netapi32.dll', 'int', 'NetJoinDomain', "ptr", $Ptr[1], "ptr", $Ptr[0], "ptr", $Ptr[1], "ptr", $Ptr[1], "ptr", $Ptr[1], "dword", 0)
    If @error Then Return SetError(1, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    Return 1
    EndFunc ;==>_ChangeWorkgroup

    [/autoit]
  • Das ist ja sehr geil :)

    Doch leider zu früh gefreut, funzt bei mir nicht: Nach gut 1 Sek. ists vorbei und nix is passiert.

    was mache ich falsch, was benötige ich evtl. zusätzlich? Habe Win XP Pro SP2.

    Adminrechte habe ich natürlich ;)

    Grüße,
    Buffo

    2 Mal editiert, zuletzt von Buffo (15. November 2007 um 14:12)

  • Habe auch XP Pro SP2 mit Admin-Rechten.
    Kann momentan auch nicht viel mehr sagen als: Bei mir funktioniert es einwandfrei... ;)

    Wenn es direkt am DLL-Call liegen sollte habe ich mal das Skript bisschen angepasst (und auch auf die Möglichkeit andere PC´s zu ändern erweitert).
    Lass dieses Skript so wie es ist mal laufen und poste mal den dann eventuell erscheinenden Fehlercode:

    Spoiler anzeigen
    [autoit]

    If _ChangeWorkgroup("TEST") Then MsgBox(0,"", "Änderung der Arbeitsgruppe erfolgreich!")
    MsgBox(0,"", "Fehlercode: " & @error)

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _ChangeWorkgroup()
    ; Description: Change computer´s workgroup
    ; Parameter(s): $WGName = new workgroup name
    ; [$PCName] = name of the network pc-name
    ; Requirement(s): Netapi32.dll
    ; Return Value(s): On Success - 1
    ; On Failure - 0 and sets @ERROR = 1
    ; Note(s): may require reboot to take effect
    ; Author(s): [email='AspirinJunkie@german-nlite.de'][/email]
    ;
    ;===============================================================================
    Func _ChangeWorkgroup($WGName, $PCName = @ComputerName)
    Local $struct[3], $Ptr[3]
    $struct[0] = DllStructCreate("wchar[100]")
    If @error Then Return SetError(1, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $struct[1] = DllStructCreate("wchar[1]")
    If @error Then Return SetError(1, 1, 0)

    $struct[2] = DllStructCreate("wchar[100]")
    If @error Then Return SetError(1, 1, 0)

    DllStructSetData($struct[0], 1, $WGName)
    If @error Then Return SetError(1, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($struct[1], 1, 0)
    If @error Then Return SetError(1, 1, 0)

    DllStructSetData($struct[2], 1, $PCName)
    If @error Then Return SetError(1, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $Ptr[0] = DllStructGetPtr($struct[0])
    $Ptr[1] = DllStructGetPtr($struct[1])
    $Ptr[2] = DllStructGetPtr($struct[2])

    DllCall('Netapi32.dll', 'none', 'NetJoinDomain', "ptr", $Ptr[1], "ptr", $Ptr[0], "ptr", $Ptr[1], "ptr", $Ptr[1], "ptr", $Ptr[1], "dword", 0)
    If @error Then Return SetError(@error, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    Return 1
    EndFunc ;==>_ChangeWorkgroup

    [/autoit]

    Ansonsten ist mein Wissen was API-Calls angeht ziemlich beschränkt und ich kann nicht auf Anhieb sagen woran es liegen könnte.
    Wie gesagt - bei mir funktioniert es - sogar ohne Reboot ist damit in den Systemeinstellungen eine andere Arbeitsgruppe eingetragen =)

  • Na dann betreiben wir das Error-Handling mal etwas exzessiver - folgendes bitte mal ausführen und Ausgabe posten - danke:

    Spoiler anzeigen
    [autoit]

    If _ChangeWorkgroup("TEST") Then MsgBox(0, "", "Änderung der Arbeitsgruppe erfolgreich!")
    MsgBox(0, "", "Fehlercode: " & @error & @CRLF & "Extended: " & @extended)

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _ChangeWorkgroup()
    ; Description: Change computer´s workgroup
    ; Parameter(s): $WGName = new workgroup name
    ; [$PCName] = name of the network pc-name
    ; Requirement(s): Netapi32.dll
    ; Return Value(s): On Success - 1
    ; On Failure - 0 and sets @ERROR
    ; 1: failure creating structure
    ; 2: failure setting data
    ; 3: failure get pointer
    ; 4: failure dll-call
    ; (func-errors --> @extended)
    ; Note(s): may require reboot to take effect
    ; needs at least Autoit Version 3.2.8.0
    ; Author(s): [EMAIL]AspirinJunkie at german-nlite.de[/EMAIL]
    ;
    ;===============================================================================
    Func _ChangeWorkgroup($WGName, $PCName = @ComputerName)
    Local $struct[3], $Ptr[3], $Return

    [/autoit] [autoit][/autoit] [autoit]

    $struct[0] = DllStructCreate("wchar[" & StringLen($WGName) + 1 & "]")
    If @error Then Return SetError(1, @error, 0)
    $struct[1] = DllStructCreate("wchar[1]")
    If @error Then Return SetError(1, @error, 0)
    $struct[2] = DllStructCreate("wchar[" & StringLen($PCName) + 1 & "]")
    If @error Then Return SetError(1, @error, 0)

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($struct[0], 1, $WGName)
    If @error Then Return SetError(2, @error, 0)
    DllStructSetData($struct[1], 1, '')
    If @error Then Return SetError(2, @error, 0)
    DllStructSetData($struct[2], 1, $PCName)
    If @error Then Return SetError(2, @error, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $Ptr[0] = DllStructGetPtr($struct[0])
    If @error Then Return SetError(3, @error, 0)
    $Ptr[1] = DllStructGetPtr($struct[1])
    If @error Then Return SetError(3, @error, 0)
    $Ptr[2] = DllStructGetPtr($struct[2])
    If @error Then Return SetError(3, @error, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $Return = DllCall('Netapi32.dll', 'int', 'NetJoinDomain', "ptr", $Ptr[2], "ptr", $Ptr[0], "ptr", $Ptr[1], "ptr", $Ptr[1], "ptr", $Ptr[1], "dword", 0)
    If @error Then Return SetError(4, @error, 0)

    [/autoit] [autoit][/autoit] [autoit]

    Return SetError(0, $Return[0], 1)
    EndFunc ;==>_ChangeWorkgroup

    [/autoit]

    3 Mal editiert, zuletzt von AspirinJunkie (16. November 2007 um 10:50)

  • Sorry, dass ich mich jetzt erst wieder melde, aber das Real-Life hat mich eingeholt 8o

    Also - Fehlercode: 1; Extended: 2.

    Kannst du damit was anfangen? Mir sagt diese DDLStruct-Geschicte nämlich gar nix ;)

    Grüße,
    Buffo