Benutzer mit den meisten Antworten
Problem mit New-PSDrive per Skript - Nach Ende des Skripts werden die erstellten Netzlaufwerke direkt wieder gelöscht

Frage
-
Hallo zusammen,
ich bin PowerShell Frischling, kam aber mit dem Code bisher ziemlich schnell klar. Nun habe ich allerdings direkt schon mein erstes Problem:
Folgendes Szenario:
Ich möchte per Powershell-Skript (dass zu einem späteren Zeitpunkt durch die Aufgabenplanung aufgerufen wird) Netzlaufwerke (auf einem NAS im internen Netzwerk) verbinden.
Bisher machte ich das per NET USE, was mir aber zwischenzeitlich aus verschiedenen Gründen missfällt. Nun habe ich mich in PowerShell eingearbeitet und eine, wie ich finde, für mich zufriedenstellendes Skript zum Verbinden der Netzlaufwerke erstellt. Dazu werden einmalig die Credentials eingelesen und als xml im Nutzerordner abgelegt. Im Skript soll dann beim Systemstart die xml eingelesen und die Netzlaufwerke per New-PSDrive verbunden werden.
Und nun zu dem Problem:
Das Skript funktioniert, wenn ich es Copy&Paste in die Powershell (Version 5.1.14393.576 unter Windows 10) kopiere und abarbeiten lasse. Wenn ich die PowerShell verlasse, bestehen die Netzlaufwerke weiter.
Es funktioniert ebenfalls, wenn ich das Skript aus PowerShell ISE starte.
Es kommt allerdings zu einem mir unerklärbaren Effekt, den ich immerhin eingrenzen konnte, wenn ich die Skriptdatei (*.ps1) ausführen lasse: Starte ich das Skript (z. B. per Verknüpfung oder aus einer Batch-Datei), dann wird es sauber abgearbeitet, die Netzlaufwerke bestehen jedoch nur solange, wie das Skript noch aktiv ist. Zum Testen habe ich ein Start-Sleep 30 an mein Skript gehängt...die Netzlaufwerke bleiben exakt für 30 Sekunden verbunden und trennen sich dann wieder (weder in der PowerShell noch im Windows Explorer kann danach auf diese zugegriffen werden). Quasi der gleiche Effekt, wie ein net use * /del /yes.
Da ich erst mein Skript im Verdacht hatte (diverse Variablen werden übergeben), habe ich es auf ein Minimum reduziert, der Effekt bleibt der gleiche, wenn ich den New-PSDrive Befehl möglichst direkt ausführe. Bei folgendem minimalistischen Skript tritt das Problem also leider bereits auf.
Minimalskript:
$pwNew = Get-Credential New-PSDrive -name "Z" -psprovider “FileSystem” -Credential $pwNew -root "\\192.168.2.100\Daten" -Persist Start-Sleep 20
Ich starte das Skript derzeit beispielsweise über eine Batch Datei:
PowerShell.exe -ExecutionPolicy Bypass -Command "& 'C:\Users\Nutzername\Netzlaufwerke\minimal.ps1'" pause
Sonstiges:
Die Execution Policy hatte ich auf dem PC testweise mal auf unrestricted, was allerdings keine Änderung brachte. Ich denke, wenn es daran liegt, dann dürfte das Skript ja überhaupt nicht starten.
Gibt es sonstige Sicherheitsbeschränkungen, die den Effekt erklären oder ist mir einfach ein ganz großer Schnitzer unterlaufen? Ich habe zwischenzeitlich sehr viel hier in den Foren und auch per google gesucht, aber leider keinen passenden Hinweis gefunden, der mir weiterhelfen könnte :-(
- Bearbeitet jvsh Dienstag, 10. Januar 2017 09:27
Antworten
-
Problem gelöst...
:facepalm:
Der Code zum Aufrufen per Script/Verknüpfung muss so aussehen:
PowerShell.exe -ExecutionPolicy Bypass -Command ". 'C:\Users\Nutzername\Netzlaufwerke\minimal.ps1'" pause
also ein . statt & vor dem Pfad zur Skript-Datei...hat also wohl was mit dem Sicherheitsbereich der Variablen (Scope) zu tun. Das dies zu einem so komischen Effekt führt, hätte ich nicht gedacht. Ich dachte, ich hätte die verschiedenen Aufrufe schon ausprobiert, offensichtlich jedoch nicht. Also falls es jemandem weiter hilft, der ein ähnliches Problem hat :-)
Alle Antworten
-
Problem gelöst...
:facepalm:
Der Code zum Aufrufen per Script/Verknüpfung muss so aussehen:
PowerShell.exe -ExecutionPolicy Bypass -Command ". 'C:\Users\Nutzername\Netzlaufwerke\minimal.ps1'" pause
also ein . statt & vor dem Pfad zur Skript-Datei...hat also wohl was mit dem Sicherheitsbereich der Variablen (Scope) zu tun. Das dies zu einem so komischen Effekt führt, hätte ich nicht gedacht. Ich dachte, ich hätte die verschiedenen Aufrufe schon ausprobiert, offensichtlich jedoch nicht. Also falls es jemandem weiter hilft, der ein ähnliches Problem hat :-)
-
hmmm ... ich finde es immer komisch, dass das für mich Naheliegenste offenbar niemand anders sieht. Warum benutzt keiner den Parameter -File? Der ist dafür gemacht, der Powershell-Konsole eine Skriptdatei mitzugeben, die diese dann ausführt. Oder spricht da irgendwas dagegen?
Grüße - Best regards
PS:> (79,108,97,102|%{[char]$_})-join'' -
doch, ich ;-)
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com -
BOfH_666:
> Oder spricht da irgendwas dagegen?
Nein da spricht nichts dagegen. Der Unterschied ist aber auch nicht groß.
Es sei denn man arbeitet mit Exitcodes, z.B. via "exit <code>", das funktioniert nur vernünftig wenn man über den "-file"-Parameter aufruft.Beim Aufruf über "-command" dagegen, ist der Exitcode immer 0 oder 1.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Neu: Powershell Code Manager v5 ! Link
(Schneller, besser + komfortabler scripten.)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.
- Bearbeitet Denniver ReiningMVP, Moderator Dienstag, 10. Januar 2017 12:42