Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Powershell Netzlaufwerke trennen

Frage Entwicklung Batch & Shell

Mitglied: DanteGabriel

DanteGabriel (Level 1) - Jetzt verbinden

22.08.2011, aktualisiert 21:05 Uhr, 10325 Aufrufe, 18 Kommentare

Guten Abend zusammen,

ich versuche seit einiger Zeit ein kleines Powershell Skript zu schreiben, welches bei der Anmeldung automatisiert ablaufen soll, bedauerlicherweise komme ich nun an einer Stelle nicht weiter, ich hoffe ich kann hier ein wenig Hilfe finden.

Mein Problem bezieht sich auf das trennen von Netzlaufwerken unter Zuhilfenahme von WMI bzw. Com Objekten. Um das Ziel zu erreichen, habe ich es bislang auf 2 Wegen versucht. Ich denke es ist hilfreich, wenn ich erst den Code und dann eine Beschreibung anfüge, was bzw. warum ich was gemacht habe. (Achja um mein Problem konkret zu benennen, beide Ideen funktionieren nicht)

CODE 1
$netzlaufwerkekobj = $(New-Object -ComObject WScript Network)
$netzlaufwerke = Get-WMIObject Win32_LogicalDisk -Filter DriveType=4
foreach ($aktlaufwerk in $netzlaufwerke)
{
$aktlaufwerk | Select-Object DeviceID
$netzlaufwerkekobj.Removenetworkdrive($aktlaufwerk)
}

Okay, das war meine erste Idee, ich schaffe mit "netzlaufwerkeobj" ein COM Objekt "WScript.Network", damit ich später nicht immer das ganze Objekt ausschreiben muss. Dann habe ich eine Variable angelegt, die mir alle Laufwerke ausgibt und bereits alles bis auf die Netzlaufwerke heraus filtert. (Filter DriveType=4) Anschließend lasse ich in einer Schleife alle Objekte durchgehen, dabei ist "aktlaufwerk" die Variable die das aktuelle Laufwerk enthält. (Durchgänge = Anzahl der Laufwerke) In der Schleife soll vom aktuellen Laufwerk die ID selektiert werden, damit diese im nächsten Schritt den Laufwerksbuchstaben für das entfernen des Netzlaufwerks bereitstellt.


<CODE-2->

#Netzlaufwerke entfernen

$netzlaufwerkekobj = $(New-Object -ComObject WScript.Network)

$netzlaufwerke = Get-WMIObject Win32_LogicalDisk -Filter DriveType=4

foreach ($aktlaufwerk in $netzlaufwerke)

{
$aktlaufwerk | Select-Object DeviceID
[string]$abc = $aktlaufwerk
$abc = $abc.substring(11) <#Gibt auf der PS @{Device=Buchstabe:} aus, welches nur ab dem 11 Zeichen angezeigt wird#>
$bcd = $abc.substring(0,2)
$netzlaufwerkekobj.Removenetworkdrive("$bcd")
}

Meine zweite Idee bestand darin, das meine erste Idee nicht funktionieren könnte, da er den Pfadbuchstaben nicht übernehmen kann, also habe ich versucht diesen als String anzugeben. Da "Select-Object DeviceID" als String eine Ausgabe der Form @{Device=Buchstabe:} schafft, schneide ich mit substring alles bis auf den Pfadbuchstaben und den Doppelpunkt ab. Anschließend füge ich den beschnittenen String in den Befehl zur Laufwerksentfernung ein. Da es sich um eine Foreachschleife handelt, müssten "abc" und "bcd" immer den aktuellen Pfadbuchstaben ausgeben. (Was unter Power GUI und der Zeilenweise wiedergabe des Codes auch in den Variablen steht)

Mein Problem ist aber, wie bereits erwähnt, das beide Ideen nicht funktionieren. Wenn ich jedoch den Befehl : >>$(New-Object -ComObject WScript.Network).Removenetworkdrive("T:")<< manuell in die Powershell eingebe, entfernt die Powershell (hier als Beispiel das Laufwerk T) das Laufwerk.

Ich verstehe aber auch nicht, warum die Powershell die manuelle Eingabe akzeptiert, die automatisierte aber nicht. (Nebenbei es ist kein Leerzeichen oder so vorhanden, wodurch es nicht klappen könnte, ich habe die Länge der abgeschnittenen Strings geprüft, sie ist wie erwartet 2 (Also Buchstabe und der Doppelpunkt)




Naja ich hoffe ihr habt eine Idee woran es liegen könnte, falls noch Angaben fehlen oder ihr noch eine Frage habt gebt mir bitte Bescheid.

mit freundlichen Grüßen:

Dante Gabriel
Mitglied: filippg
22.08.2011 um 21:18 Uhr
Hallo,

wenn was nicht funktioniert ist es ja hilfreich, wenn man schreibt, was genau nicht funktioniert (z.B. ob es eine Fehlermedlung gibt).
Aber spontan wäre mein Tipp, dass der Fehler gleich in der ersten Zeile liegt: $netzlaufwerkekobj = $(New-Object -ComObject WScript.Network) hat m.E. ein $ zu viel, $netzlaufwerkekobj = New-Object -ComObject WScript.Network könnte besser funktionieren.
Daneben der Hinweis, dass in der PowerShell auch alle cmd-Befehle funktionieren, also auch net use. Manchmal ist das einfacher...

Gruß

Filipp
Bitte warten ..
Mitglied: DanteGabriel
22.08.2011 um 21:47 Uhr
Hm naja Powershell gibt schon einen Fehler aus, der sagt aber nur das die Netzwerkverbindung nicht vorhanden ist. (Was letztlich nicht stimmt.)

Fehlermeldung: "Ausnahme beim Aufrufen von "RemoveNetworkDrive" mit 1 Argument(en): "Diese Netzwerkverb
indung ist nicht vorhanden."

Die Sache mit dem $ ist glaube ich so richtig. Jedenfalls funktioniert sonst der Aufruf von Removenetworkdrive nicht mehr (wenn ich das richtig verstanden habe)

achja mit net use habe ich es nicht hinbekommen, da ich wohl eine ungültige Eingabe mit der Variablen schaffe (da er auch dort die Netzwerkverbindung nicht trennen kann). net use $bcd /delete (in der Schleife) gibt zumindest eine solche Rückmeldung.

Fehlermeldung bei net use "net.exe : Die Netzwerkverbindung konnte nicht gefunden werden."

mit freundlichen Grüßen:

Dante Gabriel
Bitte warten ..
Mitglied: 60730
22.08.2011 um 22:25 Uhr
moin,
wenn net use $bcd /delete nicht funktioniert, bist du dir sicher, dass du eine Verbindung zu $BCD hast?

Ps: Ich würds ja auf die altertümliche Art machen...
for %a in (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) do if exist %a:\ net use %a /d /y >nul >2nul

Klar ist die alte Holzhammermethode die sich nicht drum kümmert, ob ein Laufwerk lokal oder ein Netzwerklaufwerk ist, aber will man das in dem Fall auch wirklich wissen?
Ich vermute, der einzeiler ist trotzdem deutlich schneller (auf jeden Fall geschrieben)

Gruß
Bitte warten ..
Mitglied: bastla
22.08.2011 um 23:15 Uhr
@T-Mo
Und
net use * /d /y >nul 2>nul
magst Du nicht? (Ok, von Druckern war bisher nicht die Rede ...)
@DanteGabriel (BTW: Willkommen im Forum!)
Die hier verfügbare Codeformatierung passt auch für PoSh-Scripts ...

Grüße
bastla
Bitte warten ..
Mitglied: DanteGabriel
23.08.2011 um 10:04 Uhr
@TimoBeil

Die Holzhammermethode würde in meinem fall nichts bringen, zum einen weil das Skript (unteranderem) über Thin Clients laufen soll, und einige Laufwerke nicht entfernt werden sollen.

$bcd ist belegt, lustigerweise gibt die PS jetzt keine Fehler mehr aus, schmeißt dafür aber auch nicht alle Laufwerke raus, sondern nur ca. die Hälfte

ich schreibe mal den Auswurf der PS wenn sie abc und bcd mit ausgeben soll.

DeviceID

L:
var abc hat den Wert: L:"
var bcd hat den Wert: L:
T:
var abc hat den Wert: T:"
var bcd hat den Wert: T:
Z:
var abc hat den Wert: Z:"
var bcd hat den Wert: Z:

Naja nun sind aber Laufwerk L und z so halb noch vorhanden. Laufwerk L ist vollständig zugänglich, Laufwerk Z steht im Explorer zwar als "Nicht verbunden", was sich peer Doppelklick jedoch umgehend ändert. Laufwerk T wurde sauber getrennt.

Im Code habe ich jetzt den String noch etwas anders beschnitten, damit der mir den ganzen Quellpfad anzeigt und dort den Buchstaben sammt Doppelpunkt herausgeschnitten. (Also einen String der Form \\name\root\cimv2:Win32_LogicalDisk.DeviceID="BUCHSTABE:" )


@bastla
Danke fürs Willkommenheißen
Bitte warten ..
Mitglied: 60730
23.08.2011 um 15:32 Uhr
Salü und auch von mir nachträgliches willkommen.

[OT]
Die Holzhammermethode würde in meinem fall nichts bringen, zum einen weil das Skript (unteranderem) über Thin Clients laufen soll, und einige Laufwerke nicht entfernt werden sollen.

Naja - daher hab ich ja auch die Holzhammermethode und nicht den Bastlaschen Amboss genommen.

Die Schleife entfernt ja nur die Laufwerksbuchstaben, die in der Schleife genannt werden, ich hatte der einfachkeithalber ja das komplette ABC da reingemalt.
[/OT]

Gruß
Bitte warten ..
Mitglied: DanteGabriel
23.08.2011 um 16:04 Uhr
@TimoBeil

Ja das dachte ich mir schon, ich habe nur das Problem das ich dann für alle Server (Terminal Server) die Laufwerksbuchstaben raussuchen muss, und dann noch die Skripte durchsuchen muss, welche Laufwerke erhalten bleiben sollen. (Nicht Netzlaufwerke) wenn ich das alles händisch eingeben müsste, wäre ein Automatismus wenig Sinnvoll. Aus diesem Grund hatte ich es ja extra über die DriveID versucht, die expliziet Laufwerke eines bestimmten Typs ausgibt. (Netzlaufwerk, HDD usw.)


Und Danke auch dir fürs Willkommenheißen

mit freundlichen Grüßen:

Dante Gabriel
Bitte warten ..
Mitglied: bastla
23.08.2011 um 16:16 Uhr
Hallo DanteGabriel!
die Laufwerksbuchstaben raussuchen muss, und dann noch die Skripte durchsuchen muss, welche Laufwerke erhalten bleiben sollen. (Nicht Netzlaufwerke)
Mit "net use /d" können ja nur Netzlaufwerke getrennt werden (was eigentlich auch Deine Tests schon ergeben haben sollen ) ...

Grüße
bastla
Bitte warten ..
Mitglied: DanteGabriel
23.08.2011 um 16:36 Uhr
Hm moment jetzt komme ich nich ganz mit ^^

Also der Befehl
01.
for %a in (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) do if exist %a:\ net use %a /d /y >nul >2nul
funktioniert bei mir so nicht, damit erhalte ich den Fehler: "Fehlende öffnende "(" nach dem Schlüsselwort "for"."

Ich hatte net use in verbindung mit der variable bcd verwendet, also in der Form "net use $bcd" und das hatte nicht funktioniert. Zum Vergleich mal die Version mit net use

01.
$netlaufwerkewerkobj = $(New-Object -ComObject WScript.Network) 
02.
$netzlaufwerke = Get-WMIObject Win32_LogicalDisk -Filter DriveType=4 
03.
foreach ($aktlaufwerk in $netzlaufwerke) 
04.
05.
 
06.
 
07.
$aktlaufwerk | Select-Object DeviceID  
08.
[string]$abc = $aktlaufwerk 
09.
$abc = $abc.Substring(48) 
10.
"var abc hat den Wert: " +$abc 
11.
$bcd = $abc.Substring(0,2) #Abschneiden des Strings auf den Laufwerksbuchstaben z.B. T: 
12.
"var bcd hat den Wert: " +$bcd 
13.
 
14.
net use $bcd 
15.
}
Dies führt zu folgender Ausgabe:
01.
DeviceID                                                                                                                                                                      
02.
--------                                                                                                                                                                      
03.
L:                                                                                                                                                                            
04.
var abc hat den Wert: L:" 
05.
var bcd hat den Wert: L: 
06.
Lokaler Name      L: 
07.
Remotename        \\Server\Ordner 
08.
Ressourcentyp     Platte 
09.
Status            OK 
10.
Öffnungen         0 
11.
Verbindungen      1 
12.
Der Befehl wurde erfolgreich ausgeführt. 
13.
 
14.
T:                                                                                                                                                                            
15.
var abc hat den Wert: T:" 
16.
var bcd hat den Wert: T: 
17.
Lokaler Name      T: 
18.
Remotename        \\Server\IOrdner 
19.
Ressourcentyp     Platte 
20.
Status            OK 
21.
Öffnungen         6 
22.
Verbindungen      1 
23.
Der Befehl wurde erfolgreich ausgeführt. 
24.
 
25.
Z:                                                                                                                                                                            
26.
var abc hat den Wert: Z:" 
27.
var bcd hat den Wert: Z: 
28.
Lokaler Name      Z: 
29.
Remotename        \\Server\Ordner 
30.
Ressourcentyp     Platte 
31.
Status            OK 
32.
Öffnungen         0 
33.
Verbindungen      1 
34.
Der Befehl wurde erfolgreich ausgeführt. 
35.
 
Jedoch wird kein einziges Laufwerk getrennt.
Bitte warten ..
Mitglied: 60730
23.08.2011 um 16:49 Uhr
Salü,

Zitat von DanteGabriel:
Hm moment jetzt komme ich nich ganz mit ^^

Also der Befehl ...
Ist eine Demo für die "Dosbox" / cmd.exe als batch müßten da jeweils zwei % statt einem % stehen.
Du willst aber eine Powershellvariante oder versuchst die Demo dem Powershell unterzujubeln.

Ich gebs zu, hätte ich explizit drauf eingehen müssen, aber irgendwie hattest du / ich an deiner Frage "nur" fehlende Code Tags zu reklamieren - ich dachte, du wärst ein alter hase, der das auf den ersten Blick erkennt.

Und bei der frage und der Lösung in Powershell denke ich halt meinem Alter entsprechend an die Kanonen und die Spatzen.

(Ich mach das Mappen wohl bis zur Rente in 25 Jahren noch mit purem cmd)

Gruß
Bitte warten ..
Mitglied: DanteGabriel
23.08.2011 um 16:58 Uhr
@TimoBeil:

Nein ein alter hase bin ich leider nicht ^^ beschäftige mich erst seit einiger Zeit mit der Powershell und ich fand bislang weder im Netz noch im Buch (Das von Dr- Holger Schwichtenberg) einen Lösungsansatz oder die zündende Idee.

Den Befehl will ich natürlich in der Powershell ausführen, allerdings gelingt mir da die Übertragung offensichtlich nicht, wobei ich auch gerade nicht weiß welche Parameter net use in der Powershell hat, soweit ich das verstanden habe handelt es sich bei net use ja nur um eine Funktion die eine Instanzierung desselben Com Objekts aufruft, womit ich weiter oben versuchte das Problem anzugehen.

Ich hatte zugegeben auch die Idee das mappen über die Powershell auszulagern, aber ich hatte mir gedacht das ich das Skript später zertifizieren könnte, so das es nur auf speziellen Servern läuft, die das zertifikat haben. Andernfalls müsste man die Sicherheit der Powershell ja runterschrauben und die execution policy mind. auf Remote umstellen.

Achja vielleicht noch eine Amüsante Sache nebenbei, wo das mit dem Mappen erwähnst,

das Mappen via
01.
#$netlaufwerkadd = $(New-Object -Com WScript.Network) 
02.
#$netlaufwerkadd.MapNetworkDrive("BUCHSTABE:", "\\Server\Ordner")
funktioniert erfreulicherweise sehr gut und zuverlässig. Naja das entfernen wie man dem Thread bzw. Threadverlauf entnehmen kann leider nicht wirklich...

mit freundlichen Grüßen:

Dante Gabriel
Bitte warten ..
Mitglied: 60730
23.08.2011 um 17:05 Uhr
Salü,

du fühsrt doch

net use $bcd
aus und bekommst die Antwort
Der Befehl wurde erfolgreich ausgeführt.

Bei Net use /ohne /parameter /d - wird auch kein Laufwerk getrennt.

mal einfach mal in deine Zeile 14 ein
/d /y
ans ende rein.

Gruß
Bitte warten ..
Mitglied: DanteGabriel
23.08.2011 um 17:16 Uhr
Ach da habe doch glatt die Aktion vergessen, muss natürlich

01.
net use $bcd  /delete

heißen

Allerdings funktioniert dies genauso "gut" wie die andere Methode

01.
DeviceID                                                                                                                                                                      
02.
--------                                                                                                                                                                      
03.
L:                                                                                                                                                                            
04.
var abc hat den Wert: L:" 
05.
var bcd hat den Wert: L: 
06.
L: wurde erfolgreich gelöscht. 
07.
 
08.
T:                                                                                                                                                                            
09.
var abc hat den Wert: T:" 
10.
var bcd hat den Wert: T: 
11.
T: wurde erfolgreich gelöscht. 
12.
 
13.
Z:                                                                                                                                                                            
14.
var abc hat den Wert: Z:" 
15.
var bcd hat den Wert: Z: 
16.
Entweder sind Dateien geöffnet, oder die Suche in den Verzeichnissen auf Z: ist noch nicht abgeschlossen. 
17.
 
Trotz der Aussgabe ist Laufwerk L immer noch gemappt und der Fehler von Laufwerk Z ist sehr eigenartig, da nichts auf dieses laufwerk zugreift. (Hatte es nur für den Test gemappt)

mit freundlichen Grüßen

Dante Gabriel
Bitte warten ..
Mitglied: DanteGabriel
24.08.2011 um 09:34 Uhr
Ah cool ich hab den Fehler gefunden, offenbar stört es die Powershell wenn etwas mit dem Laufwerk nicht ganz stimmt. (Sei es ein Programm welches z.B. kurz vorher auf ein Laufwerk zugegriffen hat, oder wenn man ein entsprechendes Laufwerk im Explorer offen hat). Eigentümlicherweise werden dann auch alle nachstehenden Laufwerke nicht getrennt.

Habe das Skript mit net use eben mal in einer Testumgebung laufen lassen, wo nichts außer der PS und dem Betriebssystem läuft und dort funktioniert es. Jetzt bleibt jedoch noch die Frage ob es eine Art Continue Parameter oder so gibt, womit net use die Laufwerke (unabhängig ob ein Programm drauf zugreift oder nicht) entfernt.

mit freundlichen Grüßen:

Dante Gabriel
Bitte warten ..
Mitglied: 60730
24.08.2011 um 10:38 Uhr
Servus,

ich fass das mal zusammen...

  • du wertest mit Powershell die aktiven Laufwerke aus, via WMI prüfst du, ob das ein Netzwerklaufwerk ist
  • und dann (weil Powershell es intern nicht kann) nimmst du einen cmd Befehl, der das Laufwerk trennt.

  • Meister Bastla hat dir doch einen Zaunpfahl aufgemalt..

Zitat von bastla:
Mit "net use /d" können ja nur Netzlaufwerke getrennt werden (was eigentlich auch Deine Tests schon ergeben haben sollen ) ...
... und ich dir auch ein paar für den kompletten Zaun.

  • Es gibt einen (in den von mir verwendeten M$ Systemen) bisher immer nutzbaren, aber undokumentierten Schalter /Y - der steht für Yes und macht genau das, was du willst - das harte trennen eines Laufwerks.
Zitat von 60730:
mal einfach mal in deine Zeile 14 ein
/d /y
ans ende rein.

btw: Meine andere obige Aussage ist (fast) falsch, natürlich baue ich (wohl auch noch bis zur Rente) Loginscripte mit Kixtart.

Gruß
Bitte warten ..
Mitglied: DanteGabriel
24.08.2011 um 12:04 Uhr
@TimoBeil

Achso jetzt verstehe ich das, aber jetzt funktioniert das dann auch endlich mal vielen Dank



Das ich einen cmd Befehl nutzen muss damit die ganze Sache läuft finde ich persönlich auch etwas ärgerlich, da es sich dann nicht mehr strickt nur um Powershell eigenen Code handelt. (Auch wenns ne Funktion ist) Aber naja, da es auf dem anderen Weg (zumindest nach meinen Versuchen) nicht funktioniert, mit net use jedoch schon hat sich die Sache erledigt.

Danke für die Hilfe

mit freundlichen Grüßen

Dante Gabriel
Bitte warten ..
Mitglied: 60730
24.08.2011 um 12:19 Uhr
Servus,
Zitat von DanteGabriel:
Aber naja, da es auf dem anderen Weg (zumindest nach meinen Versuchen) nicht funktioniert, mit net use jedoch schon hat sich die Sache erledigt.

Ich schreib dir mal, was ich, als Powershell grade frisch rausgekommen ist - "erlebt" habe..

Das Mappen via Powershellinternen Befehlen funktioniert ganz wunderbar.......
....solange man sich in der Powershell bewegt, also so ähnlich wie ein set a=b mit einem vorgeschalteten setlocal und wenn man die Powershell beendet, ist der Share wech ;-(

Danke für die Hilfe

Gerne geschehen und "Danke" fürs Danke.

mit freundlichen Grüßen
retour
Bitte warten ..
Mitglied: DanteGabriel
06.10.2011 um 08:32 Uhr
So, ich habe das Skript jetzt noch einmal optimiert, werde d.h. die Schwäche des vorherigen Skriptes beschreiben und dann die beiden verbesserten Versionen vorstellen.

Der alte Code
01.
$netlaufwerkewerkobj = $(New-Object -ComObject WScript.Network) 
02.
$netzlaufwerke = Get-WMIObject Win32_LogicalDisk -Filter DriveType=4 
03.
foreach ($aktlaufwerk in $netzlaufwerke) 
04.
{$aktlaufwerk | Select-Object DeviceID  
05.
$ghf = $aktlaufwerk 
06.
[string]$abc = $aktlaufwerk 
07.
$abc = $abc.Substring(48) 
08.
$bcd = $abc.Substring(0,2) #Abschneiden des Strings auf den Laufwerksbuchstaben z.B. T: 
09.
$netlaufwerkewerkobj.RemoveNetworkDrive("$bcd") 
Die Schwächen
Das Problem bei diesem Code ist, dass er etwas umständlich zu lesen ist und darüber hinaus die Trennung der Laufwerke vom Hostnamen abhängig ist. Weiter oben hatte ich dies ja bereits einmal erwähnt, das der String die Form "\\IP-od-Name\root\cimv2:Win32_LogicalDisk.DeviceID="BUCHSTABE:" hat. Da sich der Hostname oder der Servername in der Regel einen unterschiedlich langen Namen aufweisen, hätte man das Problem, das dieses Skript eben nur auf Rechnern läuft, deren Hostname z.B. die Länge 6 hat. Um diesem Problem entgegen zu wirken habe ich mich noch mal an den Code gesetzt und ihn auf 2 Art und Weisen optimiert.

Neuer Code Möglichkeit 1
01.
$netlaufwerkewerkobj = $(New-Object -ComObject WScript.Network) 
02.
		$netzlaufwerke = Get-WMIObject Win32_LogicalDisk -Filter DriveType=4 
03.
		[array]$IDlaufwerke = $netzlaufwerke | Select-Object DeviceID  
04.
		foreach ($aktl in $IDlaufwerke){		 
05.
			[string]$selectaktl = $aktl 
06.
			$zuentf=$selectaktl.Substring(11,2) 
07.
		        $netlaufwerkewerkobj.RemoveNetworkDrive("$zuentf")  
08.
 
09.
                        #net use $zuentf /d /y 
10.
			}
Der Unterschied zum alten Code ist, das die Device Informationen als Array gespeiert werden, die Var IDlaufwerke bekommt dann im Verlauf der Schleife die folgende Menge an Werten {@{DeviceID=L:}, @{DeviceID=T:}, @{DeviceID=Z:, .usw....}}, diese Zuweisung ist Eindeutig, dann schneiden wir nur noch alles ab was wir nicht brauchen (also nur noch den Laufwerksbuchstaben) und schon ist das ganze eine funktionstüchtige saubere Sache. Net use soll dabei eine Alternative zum Com Objekt darstellen. Eine Eigenheit spreche ich gleich aber noch an.

Neuer Code Möglichkeit 2
01.
$netlaufwerkewerkobj = $(New-Object -ComObject WScript.Network) 
02.
[array]$drivename = Get-WmiObject WIN32_MappedLogicalDisk |select Caption 
03.
		foreach ($aktl in $drivename){ 
04.
			[string]$bcd = $aktl 
05.
			$acd = $bcd.Substring(10,2) 
06.
			$netlaufwerkewerkobj.RemoveNetworkDrive("$acd")  
07.
 
08.
                        #net use $acd /d /y
Diese Alternative des Codes würde umgehend alle gemappten Laufwerke ausgeben und anschließend genau nach dem selben Schema arbeiten wie die erste Möglichkeit, es ist d.h. Geschmackssache was man lieber nutzen möchte. Im letzteren Fall, also der Möglichkeit 2 hat man eventuell noch den Vorteil das dass Skript einige Milisekunden schneller ist, da hier keine Filterung, sondern nur eine Auswahl des Laufwerknamens (Buchstabe) stattfindet.

Letzte Anmerkung
Ich habe in beiden Fällen den net use Befehl als Kommentar dazu geschrieben, da mir bislang noch kein Zusatz für das COM Objekt bekannt ist, mit dem man das "harte" Trennen von Laufwerken ermöglicht. Generell kann man sagen das dass Com Objekt (also RemoveNetzworkDrive) jedes Laufwerk entfernt, das mit der Powershell hinzugefügt wurde. Bei den anderen laufwerken (z.B. manuell hinzugefügte) trennt der befehl die Verbindung, entfernt diese jedoch nicht! Der net use Befehl, der wie in den vorherigen Posts beschrieben an DOS angelegt ist, trennt die Laufwerke hingegen strikt.

Mit freundlichen Grüßen

Dante Gabriel
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
Powershell - In Textdatei suchen und ersetzen (1)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst PowerShell Domain Join (2)

Frage von Patrick-IT zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell Hashtable to Übersichtliche Darstellung (2)

Frage von Marabunta zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...