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
;Es soll kein TrayIcon angezeigt werden
#NoTrayIcon
;Benötigte Includes
#include <GuiConstantsEx.au3>
#include <NetShare.au3>
;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
;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
;Automatische Suchfunktion aktivieren
AdlibEnable('_CheckUSB',5000)
;Endlosschleife
While 1
Sleep(2000)
WEnd
;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()