Problem mit Domain.Join unter Windows 10

  • VB.NET
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von v-go.

    Problem mit Domain.Join unter Windows 10

    Hallo Leute,

    ich verwendete unter Windows 7, Windows 8.1 folgender Routine, um ein einen Client per VB.net Applikation zu
    einer vordefinierten Domäne hinzuzufügen. Leider klappt das jetzt nicht mehr auf Windows 10 :(

    VB.NET-Quellcode

    1. Function domain_join()
    2. Dim args(4) As String
    3. Dim args2(2) As String
    4. Dim comp As ManagementObject
    5. Dim comps As ManagementObjectCollection
    6. Dim clsComps As New ManagementClass("Win32_ComputerSystem")
    7. comps = clsComps.GetInstances()
    8. For Each comp In comps
    9. Comp.InvokeMethod("UnjoinDomainOrWorkgroup", args2)
    10. args(0) = "DOMÄNE"
    11. args(1) = "PASSWORD"
    12. args(2) = "USERNAME"
    13. args(4) = "1"
    14. Dim retval As Long
    15. Try
    16. retval = comp.InvokeMethod("JoinDomainOrWorkgroup", args)
    17. Catch ex As Exception
    18. MsgBox(ex.Message)
    19. End Try
    20. Next
    21. End Function


    Der Code wird ohne Problem und ohne Fehler durchgeführt. Allerdings ohne Effekt. Es passiert einfach nichts, der
    Client wird nicht in die gewünschte Domäne hinzugefügt. Vielleicht hat jemand von euch eine Idee, wie ich das Problem
    dennoch lösen kann...

    Danke euch,

    LG
    :thumbup:
    Hi v-go!

    Also was mir gleich auffällt, soll das ganze ne Sub oder ne Function sein? Sehe gar keinen Rückgabewert.
    Außerdem hab ich mir mal des ManagementObject und die ManagementObjectCollection angesehen. Also wenn du den Code so kopiert hast(was ich ned glaub da Function ohne "As ..."
    und ohne "Return ..." und "End Function"), würde ich dir ein paar Verbesserungsvorschläge geben:

    1.)Mach aus dem args() As String und args2() As String ein args() As Object und args2() As Object -> InvokeMethod nimmt nur Object Arrays, sprich wenn du die Dummy
    Einstellungen auf "Pro" umstelllst, dann spart dir des viel nerviges "Ich will das nicht kompillieren da ich String ned in Object wandeln kann"-Gemosere vom Compiler :D

    2.) Würde ich erst mal args vor CreateInstances(nicht GetInstances) mit Werten belegen und nicht mit einer ManagementObjectCollection arbeiten(gibt nur ein ManagementObject und
    keine Collection zurück). Da kannste dann einfach auf des Object die InvokeMethod ausführen, mit dem leeren Object Array.

    3.)InvokeMethod gibt auch kein Long zurück sondern ein Object(vermutlich ieinen String). Jedenfalls BITTE BITTE um HIMMELSWILLEN mach Option Strict und Option Explicit auf "ON"
    Verstehe selber irgendwie ned, wie des bei Win7/8 funzen konnte...eigentlich müsste doch schon der Compiler, wenn er ne For Each obj As Object in Object(soll jetz nur Pseudocode
    sein), sagen "Ne! Mach ich ned"

    Probiers ma mit den Tipps und sag obs was gebracht hat :D

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Danke vielmals für deine Antwort, Radinator. Allerdings habe ich es jetzt anders gelöst. So sieht mein Sourcecode nun aus:

    VB.NET-Quellcode

    1. Function domain_join()
    2. Dim Domain As String = "DOMAIN"
    3. Dim Pswrd As String = "PASSWORD"
    4. Dim User As String = "USERNAME"
    5. Dim args(4) As String
    6. Dim args2(2) As String
    7. Dim comp As ManagementObject
    8. Dim comps As ManagementObjectCollection
    9. Dim clsComps As New ManagementClass("Win32_ComputerSystem")
    10. comps = clsComps.GetInstances()
    11. For Each comp In comps
    12. args(0) = Domain
    13. args(1) = Pswrd
    14. args(2) = User
    15. args(4) = 3
    16. Dim retVal As UInt32
    17. Dim retval2 As UInt32
    18. retVal = comp.InvokeMethod("JoinDomainOrWorkgroup", args)
    19. retval2 = Convert.ToString(retVal)
    20. If retval2 = "0" Then
    21. MsgBox("Willkommen in der Domäne")
    22. Else
    23. MsgBox(Convert.ToString(retVal) & " Fehler aufgetreten")
    24. End If
    25. Next
    26. End Function


    Wenn man args(4) = 3 macht, funktioniert es nun. Das war bisher nicht der Fall, dort musste hier für einen DomainJoin 1 stehen.
    3 bewirkt so ziemlich das selbe. Funktioniert scheinbar nun bei Win10 so.

    Danke trotzdem für deine Hilfe. Hoffe ich kann mit diesem Beitrag auch anderen verzweifelten Usern helfen, die genauso lange
    wie ich danach suchen mussten.