Powershell Netzlaufwerke trennen
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 171886
Url: https://administrator.de/contentid/171886
Ausgedruckt am: 26.11.2024 um 03:11 Uhr
18 Kommentare
Neuester Kommentar
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
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
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...
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ß
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ß
@t-mo
Und
magst Du nicht? (Ok, von Druckern war bisher nicht die Rede ...)
@DanteGabriel (BTW: Willkommen im Forum!)
Die hier verfügbare passt auch für PoSh-Scripts ...
Grüße
bastla
Und
net use * /d /y >nul 2>nul
@DanteGabriel (BTW: Willkommen im Forum!)
Die hier verfügbare passt auch für PoSh-Scripts ...
Grüße
bastla
Salü und auch von mir nachträgliches willkommen.
[OT]
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ß
[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ß
Hallo DanteGabriel!
Grüße
bastla
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
Salü,
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ß
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ß
Salü,
du fühsrt doch
Bei Net use /ohne /parameter /d - wird auch kein Laufwerk getrennt.
mal einfach mal in deine Zeile 14 ein
ans ende rein.
Gruß
du fühsrt doch
net use $bcd
aus und bekommst die AntwortDer 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
Gruß
Servus,
ich fass das mal zusammen...
btw: Meine andere obige Aussage ist (fast) falsch, natürlich baue ich (wohl auch noch bis zur Rente) Loginscripte mit Kixtart.
Gruß
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 "
... und ich dir auch ein paar für den kompletten Zaun.Mit "
net use /d
" können ja nur Netzlaufwerke getrennt werden (was eigentlich auch Deine Tests schon ergeben haben sollen ) ...- 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
ans ende rein.
mal einfach mal in deine Zeile 14 ein
/d /y
btw: Meine andere obige Aussage ist (fast) falsch, natürlich baue ich (wohl auch noch bis zur Rente) Loginscripte mit Kixtart.
Gruß
Servus,
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 ;-(
Gerne geschehen und "Danke" fürs Danke.
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.
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