Netzlaufwerke verbinden

  • Hallo ihr da draussen,

    ich hab ein kleines Script das unter anderem Netzlaufwerke verbindet.
    So sieht der Code aus:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _MapDrive()
    GUICtrlSetData($lbl_info, @CRLF & @CRLF & "Ein Moment bitte," & @CRLF & @CRLF & "Ihre Netzwerklaufwerke werden verbunden.")
    FileCopy(@LogonServer & "\netlogon\logon.vbs", @ScriptDir & "\logon.vbs")
    Sleep(500)
    If FileExists (@ScriptDir & "\logon.vbs") Then
    ;~ If $batch = 1 Then
    ShellExecuteWait(@ScriptDir & "\logon.vbs", "", @SW_HIDE)
    _WriteLogData("Kopie erfolgreich, Login Batchfile lokal ausgeführt")
    Else
    ShellExecuteWait(@LogonServer & "\netlogon\logon.vbs", "", @SW_HIDE)
    _WriteLogData("Kopieren fehlgeschlagen,Login Batchfile von Logonserver ausgeführt.")
    EndIf
    For $RoundTrip = 1 to 3
    $Drive = DriveGetDrive( "network" )
    If NOT @error Then
    GUICtrlSetData($lbl_info,@CRLF & @CRLF & "Netzlaufwerke erfolgreich verbunden.")
    ExitLoop
    Else
    GUICtrlSetData($lbl_info,@CRLF & @CRLF & "Netzlaufwerke noch nicht verbunden." &@CRLF & @CRLF & "Bitte warten...")
    RunWait(@ScriptDir & "\logon.vbs","",@SW_HIDE)
    EndIf
    Next

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

    _WriteLogData("Netzlaufwerke verbunden.")
    GUICtrlSetData($lbl_info, @CRLF & @CRLF & "Netzwerklaufwerke erfolgreich verbunden.")
    Sleep(500)
    Return
    EndFunc ;==>_MapDrive

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


    Jetzt meinte ein Kollege dass das so nicht richtig wäre, und sein Schnipsel sieht so aus:

    Spoiler anzeigen
    [autoit]


    Func _MapDrive()
    ;$LogonServer = "\\dc.PKV.intern"
    GUICtrlSetData($lbl_info, @CRLF & @CRLF & "Einen Moment bitte," & @CRLF & @CRLF & "Ihre Netzwerklaufwerke werden verbunden.")
    $batch = FileCopy(@LogonServer & "\netlogon\logon.vbs", @ScriptDir & "\logon.vbs", 1)
    Sleep(500)
    If $batch = 1 Then
    ShellExecuteWait(@ScriptDir & "\logon.vbs", "", "", "open", @SW_HIDE)
    _WriteLogData("Kopieren erfolgreich, Login Batchfile '" & @ScriptDir & "\logon.vbs' lokal ausgeführt")
    Else
    ShellExecuteWait(@LogonServer & "\netlogon\logon.vbs", "", "", "open", @SW_HIDE)
    _WriteLogData("Kopieren fehlgeschlagen, Login Batchfile von Logonserver '" & @LogonServer & "' ausgeführt.")
    EndIf
    For $RoundTrip = 1 to 3
    $Drive = DriveGetDrive( "network" )
    If NOT @error Then
    GUICtrlSetData($lbl_info,@CRLF & @CRLF & "Netzlaufwerke erfolgreich verbunden.")
    ExitLoop
    Else
    GUICtrlSetData($lbl_info,@CRLF & @CRLF & "Netzlaufwerke noch nicht verbunden." &@CRLF & @CRLF & "Bitte warten...")
    RunWait(@ScriptDir & "\logon.vbs","",@SW_HIDE)
    EndIf
    Next

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

    If NOT @error Then
    _WriteLogData("Netzlaufwerke verbunden.")
    GUICtrlSetData($lbl_info, @CRLF & @CRLF & "Netzwerklaufwerke erfolgreich verbunden.")
    Else
    _WriteLogData("Netzlaufwerke NICHT verbunden.")
    GUICtrlSetData($lbl_info, @CRLF & @CRLF & "Netzwerklaufwerke konten nicht verbunden werden.")
    EndIf
    Sleep(500)
    Return
    EndFunc ;==>_MapDrive
    ;---------------------------

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


    Jetzt wüsset ich gerne mal ob ich das [optional] in der Hilfe richtig verstehe.

    Er meint ich müsste z.B. bei

    [autoit]

    ShellExecuteWait(@ScriptDir & "\logon.vbs", "", "", "open", @SW_HIDE)

    [/autoit]

    alle Parameter angeben oder eben auch leere Strings wenn ich am Ende ein @SW_HIDE nutzen will.

    bei mir siehts so aus und funktioniert:

    [autoit]

    ShellExecuteWait(@LogonServer & "\netlogon\logon.vbs", "", @SW_HIDE)

    [/autoit]

    Welche Version ist denn jetzt richtig? Funktionieren tun beide.


    Hat einer von euch ne Idee warum das manchmal trotzdem nicht klappt?
    Wir vermuten dass das Problem nicht im Script liegt sondern irgdnewelche anderen Ursachen dazu führen die wir einfach nicht kennen.
    Netzlaufwerke verbinden klappt ja nicht immer 100%ig. Gerade wenn man sich über UMTS per VPN einwählt gibt es da immer wieder Probleme.

    Woran kann das noch liegen? Selbst wenn die verbindung schlecht ist müssten die Laufwerke doch verbunden werden "können". Oder gibt es da irgednwelche Timeouts die man ändern kann?

    Und dann noch eine Frage:
    Mit

    [autoit]

    $Drive = DriveGetDrive( "network" )

    [/autoit]

    überprüfe ich ob es ein Netzlaufwerk gibt. Wenn ja hat das mapping geklappt.
    Das Problem ist dass dieses Tool mittlerweile Firmenübergreifend eingesetzt wird und in den anderen Firmen gibt es Mitarbeiter die händisch gemappte Laufwerke haben.
    Kann ich noch irgendwie anders zuverlässig testen ob das funktioniert hat?
    Laufwerksbuchstabe abfragen dgeht auch nicht weil die je nach Firma unterschiedlich sind.

  • Warum nehmt ihr nicht die Autoiteigene Mapfunktion? Dann haben sich alle eure Probleme gelöst.

    [autoit]

    DriveMapAdd

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Tja, das ist nicht gewünscht. Wir haben ein vbs Script das je nach Gruppenzugehörigkeit die Laufwerke mappt. Unud wenns dann in den nächsten 1000 Jahren mal eine Änderung geben sollte müsste man ja nur dieses vbs Script ändern.

    Da hab ich aber auch schon dran überlegt dieses Gruppenbezogenen Mapping mit Autoit zu machen.

    Edit: das müsset doch gehen oder? Mit der _AD_GetUserGroups.au3

    [autoit]

    #AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y
    ; *****************************************************************************
    ; Example 1
    ; Get a sorted array of group names (FQDN) that the user is immediately a
    ; member of.
    ; *****************************************************************************
    #include <AD.au3>

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

    ; Open Connection to the Active Directory
    _AD_Open()
    If @error Then Exit MsgBox(16, "Active Directory Example Skript", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended)

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

    ; Get a sorted array of group names (FQDN) that the user is immediately a member of
    Global $aUser = _AD_GetUserGroups(@UserName)
    If @error > 0 Then
    MsgBox(64, "Active Directory Functions - Example 1", "User '" & @UserName & "' has not been assigned to any group")
    Else
    _ArraySort($aUser, 0, 1)
    _ArrayDisplay($aUser, "Active Directory Functions - Example 1 - Group names user '" & @UserName & "' is immediately a member of")
    EndIf

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

    ; Close Connection to the Active Directory
    _AD_Close()

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

    ;~ If $aUser =

    [/autoit]

    Aber ich kapier nicht ganz wie ich dann Abfrage ob der User in einer bestimmten Gruppe ist.

    [autoit]

    _ArraySearch

    [/autoit]


    hab ich auch schon gefunden aber das klappt auch nicht so wie ich mir das gedacht habe.

    Also frei übersetzt aus dem vbs File müsset ich in Autoit was bauen das so aussieht:

    Wenn der User in dieser Gruppe ist, mappe dieses Laufwerk.

    Kann mir da einer auf die Sprünge helfen? :S

    Einmal editiert, zuletzt von Camulus (14. Juni 2012 um 11:07)

  • Gut das wäre ja auch nicht das Problem. Legt doch einfach statt dem VBS eine Ini datei auf die Netzwerkfreigabe in der einfach für jede Gruppe eine Sektion ist und in der Sektion dann die Laufwerke als Schlüssel.

    Das hat mehrer Vorteile:

    1. DriveMapAdd gibt direkt zurück ob das Verbinden zum Laufwerk erfolgreich war oder nicht
    2. Die Laufzeit wird verringert das nicht erst noch das vbs ausgeführt werden muss
    3. Es muss nichts am Autoitscript verändert werden den neue Gruppe hinzukommen, entfernt werden oder die Laufwerke anders zugeordnet werden.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    • Offizieller Beitrag

    Hat einer von euch ne Idee warum das manchmal trotzdem nicht klappt?

    Das gezeigte Skript bereitet sicher keine Probleme. Ursachen würde ich mal in dem (völlig unnötigen) vbs-Skript suchen.

    Das Problem ist dass dieses Tool mittlerweile Firmenübergreifend eingesetzt wird und in den anderen Firmen gibt es Mitarbeiter die händisch gemappte Laufwerke haben.
    Kann ich noch irgendwie anders zuverlässig testen ob das funktioniert hat?

    Das spielt doch keine Rolle, ob per Hand oder per Skript gemapt. Ein Netzlaufwerk ist immer mit dem entsprechenden Flag versehen und wird durch die Laufwerksabfrage auch als solches identifiziert.

    Tja, das ist nicht gewünscht. Wir haben ein vbs Script das je nach Gruppenzugehörigkeit die Laufwerke mappt. Unud wenns dann in den nächsten 1000 Jahren mal eine Änderung geben sollte müsste man ja nur dieses vbs Script ändern.

    Und wieso soll das Problem Gruppenzugehörigkeit nur mit vbs lösbar sein?
    Meiner Meinung nach schafft ihr euch nur zusätzliche Fehlerquellen, beim Aufruf eines Skriptes durch ein anderes Skriptformat. Sauber alles in einem und der Drops ist gelutscht.

  • :huh: das klingt schonmal gut aber ich hab keine Vorstellung davon wie du das meinst 8|

    Also in der ini- Datei soll dann sowas stehen?:

    [autoit]

    [Gruppe 1]
    key= \\Servername\Freigabename\

    [/autoit]

    oder wie meinst du das?


    EDIT:
    BugFix : bei mir rennst du da offene Türen ein. Aber es gibt halt Kollegen die AutoIt nicht kennen (wollen) und Angst haben dass es nicht geändert werden kann wenn mal einer aufällt der es kann.
    Was das händische Mapping betrifft war das Problem dass das Tool ein Netzlaufwerk findet (das statisch gemappte) und deswegen keinen Fehler anzeigt.

    Aber ich bin für Änderungen immer offen. Wenn ihr mir ein paar Schlagkräftige Argumente dazu liefert um so besser. :D

    In der Urversion von diesem Tool wurde es auch mit DriveMapAdd gemacht, aber dann wollte man flexibler sein und nicht immer eine neue Programmversion ausrollen nur weil sich mal ein Netzwerkpfad ändert.
    Aber ich denke das Argument könnte ich heuet auch wieder aushebeln weil es mittlerweile mehrere gibt die AutoIt- Fans sind. 8)

    2 Mal editiert, zuletzt von Camulus (14. Juni 2012 um 11:17)

  • Ich hab heute meinen guten Tag ;). Da brauchst "nie" wieder was an dem Autoitscript ändern oder neue Version ausrollen.

    [autoit]

    #include <AD.au3>

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

    _AD_Open()
    $aUser = _AD_GetUserGroups(@UserName)
    _AD_Close()

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

    $gruppen = IniReadSectionNames("gruppen.ini")

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

    For $k = 1 To $gruppen[0]
    _ArraySearch($aUser, "OU=" & $gruppen[$k], 0, 0, 0, 1)
    If Not @error Then
    $maps = IniReadSection("gruppen.ini", $gruppen[$k])
    For $i = 1 To $maps[0][0] Step 1
    DriveMapAdd("*", $maps[$i][0])
    Next
    EndIf
    Next

    [/autoit]

    Ini sieht so aus:

    Code
    [Gruppennamen]
    \\Servername\Freigabename=1

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Danke!!! :thumbup:

    Hast du auch noch einen Tipp was ich den vbs- Verfechtern dann an den Kopf werfen kann?
    ini ist besser weil....

    Sorry das ich so blöd frage aber diese Fragenb werden kommen und dann brauch ich hieb und stichfeste Argumente, und will auch kein gutes vergessen :rolleyes:


  • Hast du auch noch einen Tipp was ich den vbs- Verfechtern dann an den Kopf werfen kann?

    Dazu Zitat aus der Wiki:

    "Die Nutzung von VBScript wird von Microsoft derzeit noch unterstützt. Allerdings werden keine neuen Features mehr zu VBS hinzugefügt. So wird von VBScript auch als tote Programmiersprache gesprochen, da die Nachfolgeprodukte von Microsoft bereits erhältlich sind."

    Oder anders gesagt VBS wird früher oder später nichtmehr von Windows unterstützt werden und dann habt ihr ein gewaltiges Problem.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • :thumbup:
    das ist gut. Danke!


    EDIT:
    Wie kann ich denn das Array nach Gruppen durchsuchen?
    So dass ich alles Fest coden kann ohne ini?
    Für den Fall das man wünscht ganz "unabhängig" von anderen Dateien zu sein.

    2 Mal editiert, zuletzt von Camulus (14. Juni 2012 um 13:02)


  • Wie kann ich denn das Array nach Gruppen durchsuchen?
    So dass ich alles Fest coden kann ohne ini?
    Für den Fall das man wünscht ganz "unabhängig" von anderen Dateien zu sein.

    Hier aber ist ja dann genau das was zuerst nicht wolltest und zwar, dass man bei der kleinsten Änderung die exe komplett neu ausrollen muss:

    [autoit]

    #include <AD.au3>
    #include <Array.au3>

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

    Dim $freigaben[3][4] = [["Gruppenname1", "Freigabe1", "Freigabe2", "Freigabe3"],["Gruppenname2", "Freigabe1", "Freigabe2"],["Gruppenname3", "Freigabe1", "Freigabe2"]]

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

    _AD_Open()
    $aUser = _AD_GetUserGroups(@UserName)
    _AD_Close()

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

    For $k = 0 To UBound($freigaben) - 1 Step 1
    _ArraySearch($aUser, "OU=" & $freigaben[$k][0], 0, 0, 0, 1)
    If Not @error Then
    For $i = 1 To UBound($freigaben, 2) - 1 Step 1
    DriveMapAdd("*", $freigaben[$k][$i])
    Next
    EndIf
    Next

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Danke dir,

    ich selber hab kein problem damit ne neue exe auszurollen.
    Eine Änderung muss es ja erst mal geben und das ist selten genug :D

    Heute ist ein Meeting deswegen, dann sehen wir wofür man sich entscheidet. Ich darf das Ding dann nur bauen, und vielleicht eine Empfehlung abgeben.