Automatische Netzwerkfreigabe für USB Laufwerke

  • Nabend,

    ich war heute bei einem Bekannten, der hatte folgendes Problem:
    Er hat als OS Vista Home installiert und nutzt MS Virtual PC 2007 mit einem WinXP. Nun wollte er gerne auf seine Festplatten und USB Laufwerke (in seinem Fall ein Stick) zugreifen, was aber immer im Gastsystem mit einer Fehlermeldung quitiert wurde und mit dem Absturz des Exploer Prozesses. Nun habe ich mir gedacht, mache ich das nicht über das interne Tool von Virtual PC sondern gebe die Laufwerke auf dem Vista System frei und mappe sie mir dann im virtuellen System. Und da kommt das eigentliche Problem, der USB Stick muss ja immer wirder eine Freigabe erhalten wenn er rein gestöpselt wird. Nun der Auftritt von Autoit (Hinweis für pee, ich habe es klein geschrieben ;) ), ich habe das dem USB Stick einen Volumenamen verpasst und ein Skript gepastelt welches immer wieder schaut ob der Stick eingestöpselt ist oder nicht, wenn er ihn das erste mal erkennt gibt er ihn frei, wird er entfernt, wird auch die Freigabe entfernt. So kann mein lieber Bekannter auch über das Netzwerk immer auf seinen USB Stick zugreifen ohne jedes mal diesen per Hand eine Freigabe zu geben.

    Das einzige was zum Skript zu sagen ist, der Stick muss einen Volumenamen haben, und es gibt zwei Parameter bzw. drei, ruft es einfach mal mit -h auf wenn es kompeliert ist.

    Spoiler anzeigen
    [autoit]


    ;Es soll kein TrayIcon angezeigt werden
    #NoTrayIcon

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

    ;Benötigte Includes
    #include <GuiConstantsEx.au3>
    #include <NetShare.au3>

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

    ;Variablen
    Local $VolumeName = 'Usb Stick'
    Local $ShareName = 'Stick' ;Freigabename
    Local $Caption = -1 ;Laufwerksbuchstabe
    Local $Connection = False ;Prüfvariable ob der Stick als angeschlossen erkannt wurde
    Local $var,$parameter ;Hilfsvariablen

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

    ;Commandline Parameter prüfen
    If $CmdLine[0] > 0 Then
    For $var = 1 To $CmdLine[0] step 2
    $parameter = $CmdLine[$var]
    Switch $parameter
    Case '-h'
    MsgBox(64,'USB Hilfe','Folgende Parameter sind möglich:' & @LF & '-v [Volume Name]' & @LF & '-s [Freigabe Name]')
    Exit 0
    Case '-v'
    $VolumeName = $CmdLine[$var + 1]
    Case '-s'
    $ShareName = $CmdLine[$var + 1]
    Case Else
    MsgBox(64,'USB Hilfe','Folgende Parameter sind möglich:' & @LF & '-v [Volume Name]' & @LF & '-s [Freigabe Name]')
    Exit 0
    EndSwitch
    Next
    EndIf

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

    ;Automatische Suchfunktion aktivieren
    AdlibEnable('_CheckUSB',5000)

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

    ;Endlosschleife
    While 1
    Sleep(2000)
    WEnd

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

    ;Diese Funktion prüft ob der USB Stick mit dem VolumeName angeschlossen wurde
    ;wenn ja, dann soll eine Netzwerkfreigabe erfolgen, der Freigabename kommt aus der
    ;Variablen $ShareName.
    ;Wurde der USB Stick getrennt, dann wird die Freigabe wieder entfernt.
    Func _CheckUSB()
    $Caption = -1 ;Laufwerk auf -1 sethen
    ;Mittels WMI prüfen ob das Laufwerk vorhanden ist
    Dim $Obj_WMIService = ObjGet('winmgmts:\\' & @ComputerName & '\root\cimv2')
    If (IsObj($Obj_WMIService)) And (Not @error) Then
    Dim $Col_Items = $Obj_WMIService.ExecQuery('Select * from Win32_LogicalDisk Where VolumeName = "' & $VolumeName & '"')
    Local $Obj_Item
    For $Obj_Item In $Col_Items
    $Caption = $Obj_Item.Caption
    Next
    EndIf ;<= WMI ende

    If $Caption <> -1 And $Connection = False Then ;<= wurde das Laufwerk angeschlossen und noch keine Freigabe durchgeführt
    $Connection = True
    ToolTip('USB Stick wurde an Laufwerk ' & $Caption & ' angeschlossen.',0,0,'Info')
    Sleep(2500)
    ToolTip('')
    _Net_Share_ShareAdd (@ComputerName, $ShareName, 0 , $Caption & '\', "USB Laufwerk")
    ElseIf $Caption = -1 and $Connection = True Then ;<= Wurde der Stick entfernt und die Freigabe noch nicht getrennt.
    $Connection = False
    Run(@ComSpec & ' /c net share ' & $ShareName & ' /delete','',@SW_HIDE)
    EndIf
    EndFunc ;<= Ende Func _CheckUSB()

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

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

  • Hallo McPoldy,

    das sieht echt nett aus. Ich habe mal eine Frage zum Verständnis wegen AdLibEnable.
    In dem Script läßt Du alle 5 Sekunden die Funktion über AdLibEnable ausführen. In der Hauptschleife hast Du dann garnichts stehen.
    Ich hätte jetzt völlig unbedarft auf Adlibenable verzichtet und nur in der Hauptschleife die Testfunktion aufgerufen.
    Sollte bei gleichem Zeitfenster (5Sek in Adlibenable, Sleep (5000) in der Schleife) nicht dasselbe bei rauskommen?

    Also, gibt es einen speziellen Grund für Adlibenable?

    Danke :)

    TrueMu

  • Als ich das Skript geschrieben habe, hatte ich bestimmt nen guten Grund dafür, aber jetzt fällt mir keiner ein :D.

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

    • Offizieller Beitrag

    Hi,

    es ist aber definitv ein Unterschied.

    Zur Erklärung:

    Adlib wird wirklich alle 5 Sek aufgerufen. Sollte die Funktion die du aufrufst länger brauchen als 5 Sekunden, so kommt die Funktion nie zum Ende.
    Wenn du einen Sleep einbaust, dann wird deine Funktion ausgeführt und 5 Sek gewartet.

    1. 5 Sekunden
    2. 5 Sekunden + Durchlaufzeit der Funktion.

    Mega

    • Offizieller Beitrag

    Hallo

    Wen du den gleichen Sleep effekt bei AdlibEnable haben willst (kann ja mal sein :P) muss die Funktion ca so aussehen:

    [autoit]

    AdlibEnable("_test",5000)
    Func _test()
    AdlibDisable()
    ;deine funktion....
    Sleep(10000);test, wartet 10 sekunden
    AdlibEnable("_test","5000)
    Endfunc

    [/autoit]

    Hab es jetzt mal im Firefox geschrieben, sollte so aber stimmen ;)

    Mfg spider

  • @Mega stimmt wusste doch das ich mir irgendetwas dabei gedacht hab, bin heute nicht so auf der Höhe :(

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)