PowerShell Remote Zugriff auf freigegebenen Ordner
Hi Community,
neulich hatte ich mir mal ein Skript für Rechnerinstallation geschrieben, welches wunderbar funktioniert hatte. Dieses fügt einen Drucker anhand seines Druckernamens, dem Pfad der INF-Datei des Treibers dem Computer hinzu.
Da ich etwas "lauf-faul" bin ;) dachte ich, es wäre doch eine super Idee, mir das Skript so zu erweitern, dass ich diese Installation auch Remote durchführen kann.
Teil des Skripts zum hinzufügen:
$printer = Objekt mit PrinterIP (=IP des Druckers), DriverINFPath (=Pfad zur Treiber-INF-Datei) und PrinterModel (=Informationen zum Drucker, Hersteller + Modell)
1. Frage wäre, könnte ich dies auch durch ein PowerShell Cmdlet ersetzen? Das Add-Printer und Add-PrinterDriver funktioniert glaube ich nicht bei uns, da wir keinen PrintServer haben.
Nun habe ich mir das Skript erweitert, indem ich die Drucker zum Hinzufügen in eine Variable (PSObject[ ]) $printerlist speichere. Dann möchte ich für jeden ausgewählten Drucker Remote diese Liste installieren:
Problem:
Wenn ich das Skript auf meinem Rechner ausführe und auf einem anderen Rechner die Drucker installieren möchte (mit Admin Credentials für Remote-Computer) passiert gar nichts...
Wenn ich das Skript auf einem Server Remote ausführe und auf einem anderen Rechner die Drucker installieren möchte, dann wird ein Teil der Drucker installiert....
Wenn ich das Skript auf einem Server Remote ausführe und auf meinem Rechner die Drucker installieren möchte, dann werden annähernd alle Drucker installiert... ???
Die Informationen für die Drucker liegt auf einem geteilten Ordner, diese erhalte ich auch ohne Probleme und kann sie in $printerlist abspeichern. Warum aber verhalten sich unterschiedliche Geräte bei diesem Befehl von Invoke-Command aber anders??
Mein Gedanke war, dass evtl. auf den Treiber-INF-Pfad nicht zugegriffen werden kann, und tatsächlich, wenn ich am Rechner lokal mit dem Benutzer angemeldet bin, dann habe ich Zugriff auf den Treiberordner:
Test-Path \\ServerXX\Pfad\Pfad\Pfad\Druckertreiber\ --> true
Wenn ich aber auf meinem Rechner Invoke-Command localhost -ScriptBlock {Test-Path \\ServerXX\Pfad\Pfad\Pfad\Druckertreiber\} ausführe, bekomme ich:
Zugriff verweigert
+ CategoryInfo : PermissionDenied: (\\server21\Apps\Install\Treiber\Drucker\:String) [Test-Path], Unautho
rizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.TestPathCommand
+ PSComputerName : localhost
False
Ich Rufe doch lokal (am selben Rechner) mit selben Credentials den gleichen Befehl auf. Warum bekomme ich dann beim Invoke-Command Zugriff verweigert? Ist das schon ein Second-Hop Problem? Denn auch wenn ich zu Invoke-Command -Credentials meine Zugangsdaten mitgebe, so wird mir der Zugriff immer noch verweigert.
Deshalb die 2. Frage: Woran liegt das
und gleich dazu noch, wie erhalte ich Remote Zugriff auf einen freigegebenen Ordner in einer PowerShell Session?
Vielen lieben Dank schonmal im Voraus,
Micha
neulich hatte ich mir mal ein Skript für Rechnerinstallation geschrieben, welches wunderbar funktioniert hatte. Dieses fügt einen Drucker anhand seines Druckernamens, dem Pfad der INF-Datei des Treibers dem Computer hinzu.
Da ich etwas "lauf-faul" bin ;) dachte ich, es wäre doch eine super Idee, mir das Skript so zu erweitern, dass ich diese Installation auch Remote durchführen kann.
Teil des Skripts zum hinzufügen:
$newPort = ([wmiclass]"Win32_TcpIpPrinterPort").CreateInstance()
$newPort.HostAddress = $printer.PrinterIP
$newPort.Name = "IP_$($printer.PrinterIP)"
$newPort.PortNumber = 9100
$newPort.Protocol = 1
$newPort.Put()
printui /if /b "$($printer.PrinterID)" /f "$($printer.DriverINFPath)" /u /r "$($newPort.Name)" /m "$($printer.PrinterModel)"
$printer = Objekt mit PrinterIP (=IP des Druckers), DriverINFPath (=Pfad zur Treiber-INF-Datei) und PrinterModel (=Informationen zum Drucker, Hersteller + Modell)
1. Frage wäre, könnte ich dies auch durch ein PowerShell Cmdlet ersetzen? Das Add-Printer und Add-PrinterDriver funktioniert glaube ich nicht bei uns, da wir keinen PrintServer haben.
Nun habe ich mir das Skript erweitert, indem ich die Drucker zum Hinzufügen in eine Variable (PSObject[ ]) $printerlist speichere. Dann möchte ich für jeden ausgewählten Drucker Remote diese Liste installieren:
Invoke-Command -ComputerName (Read-Host "Computername") -Credential (Get-Credential -Message "Admin User for Remote Client") -ScriptBlock {
$using:printerlist | foreach `
{
$newPort = ([wmiclass]"Win32_TcpIpPrinterPort").CreateInstance();
$newPort.HostAddress = $_.PrinterIP;
$newPort.Name = "IP_$($_.PrinterIP)";
$newPort.PortNumber = 9100;
$newPort.Protocol = 1;
$newPort.Put();
printui /if /b "$($_.PrinterID)" /f "$($_.DriverINFPath)" /u /r "$($newPort.Name)" /m "$($_.PrinterModel)";
}
}
Problem:
Wenn ich das Skript auf meinem Rechner ausführe und auf einem anderen Rechner die Drucker installieren möchte (mit Admin Credentials für Remote-Computer) passiert gar nichts...
Wenn ich das Skript auf einem Server Remote ausführe und auf einem anderen Rechner die Drucker installieren möchte, dann wird ein Teil der Drucker installiert....
Wenn ich das Skript auf einem Server Remote ausführe und auf meinem Rechner die Drucker installieren möchte, dann werden annähernd alle Drucker installiert... ???
Die Informationen für die Drucker liegt auf einem geteilten Ordner, diese erhalte ich auch ohne Probleme und kann sie in $printerlist abspeichern. Warum aber verhalten sich unterschiedliche Geräte bei diesem Befehl von Invoke-Command aber anders??
Mein Gedanke war, dass evtl. auf den Treiber-INF-Pfad nicht zugegriffen werden kann, und tatsächlich, wenn ich am Rechner lokal mit dem Benutzer angemeldet bin, dann habe ich Zugriff auf den Treiberordner:
Test-Path \\ServerXX\Pfad\Pfad\Pfad\Druckertreiber\ --> true
Wenn ich aber auf meinem Rechner Invoke-Command localhost -ScriptBlock {Test-Path \\ServerXX\Pfad\Pfad\Pfad\Druckertreiber\} ausführe, bekomme ich:
Zugriff verweigert
+ CategoryInfo : PermissionDenied: (\\server21\Apps\Install\Treiber\Drucker\:String) [Test-Path], Unautho
rizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.TestPathCommand
+ PSComputerName : localhost
False
Ich Rufe doch lokal (am selben Rechner) mit selben Credentials den gleichen Befehl auf. Warum bekomme ich dann beim Invoke-Command Zugriff verweigert? Ist das schon ein Second-Hop Problem? Denn auch wenn ich zu Invoke-Command -Credentials meine Zugangsdaten mitgebe, so wird mir der Zugriff immer noch verweigert.
Deshalb die 2. Frage: Woran liegt das
Vielen lieben Dank schonmal im Voraus,
Micha
Please also mark the comments that contributed to the solution of the article
Content-ID: 6464362235
Url: https://administrator.de/forum/powershell-remote-zugriff-auf-freigegebenen-ordner-6464362235.html
Printed on: February 9, 2025 at 18:02 o'clock
10 Comments
Latest comment

Moin,
das gute alte Double-Hop-Problem
das gute alte Double-Hop-Problem
Denn auch wenn ich zu Invoke-Command -Credentials meine Zugangsdaten mitgebe, so wird mir der Zugriff immer noch verweigert.
Du musst die Credentials dann auch innerhalb des Skriptblocks, den du mit Invoke-Command aufrufst verwenden# This works without delegation, passing fresh creds
# Note $Using:Cred in nested request
$cred = Get-Credential Contoso\Administrator
Invoke-Command -ComputerName ServerB -Credential $cred -ScriptBlock {
hostname
Invoke-Command -ComputerName ServerC -Credential $Using:cred -ScriptBlock {hostname}
}

Invoke-Command ist nur exemplarisch für einen zweiten Hop dargestellt.
Versuche es mit
Das Problem ist, dass du als zweiten Hop mit Test-Path auf ein Netzwerkshare zugreifen willst, dafür braucht es ein frisches Credential.
Versuche es mit
$admin = Get-Credential
Invoke-Command -Credential $admin -ScriptBlock {Test-Path -Credential $using:admin \\ServerXX\geteilter\Ordner}
Das Problem ist, dass du als zweiten Hop mit Test-Path auf ein Netzwerkshare zugreifen willst, dafür braucht es ein frisches Credential.

Ah dann unterstützt Test-Path kein Credential.
Wie ist es mit
?
Wie ist es mit
$admin = Get-Credential
Invoke-Command -Computer Server1 -Credential $admin -ScriptBlock {
Invoke-Command -Computer localhost -Credential $using:admin -ScriptBlock {
Test-Path \\Server2\geteilter\Ordner
}
}
?

Zitat von @michi.wtr:
Denke also, es liegt wirklich nur daran, das ich diese nicht nutzen kann, weil ich Remote (warum auch immer) keinen Zugriff auf den geteilten Ordner bekomme.
Denke also, es liegt wirklich nur daran, das ich diese nicht nutzen kann, weil ich Remote (warum auch immer) keinen Zugriff auf den geteilten Ordner bekomme.
Liegt zu 100% am Double-Hop.
Schau dir nochmal das hier an und überlege, welche Lösungsmöglichkeit für dein Szenario passt.
Alternativ versuche deine Scripts so umzuschreiben und Dateien so abzulegen, dass du keinen zweiten Hop brauchst.

Wird wohl einfach nicht unterstützt, siehe hier
"This parameter isn't supported by any providers installed with PowerShell. To impersonate another user, or elevate your credentials when running this cmdlet, use Invoke-Command."
-Credential gehört jedoch zu den Standard-Parameter, die jedes CmdLet in Powershell hat, deswegen ist es verfügbar, funktioniert aber nicht
"This parameter isn't supported by any providers installed with PowerShell. To impersonate another user, or elevate your credentials when running this cmdlet, use Invoke-Command."
-Credential gehört jedoch zu den Standard-Parameter, die jedes CmdLet in Powershell hat, deswegen ist es verfügbar, funktioniert aber nicht