michi.wtr
Goto Top

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:
$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 face-smile und gleich dazu noch, wie erhalte ich Remote Zugriff auf einen freigegebenen Ordner in einer PowerShell Session?

Vielen lieben Dank schonmal im Voraus,
Micha

Content-Key: 6464362235

Url: https://administrator.de/contentid/6464362235

Printed on: April 27, 2024 at 20:04 o'clock

Mitglied: 3063370895
Solution 3063370895 Mar 22, 2023 updated at 14:54:07 (UTC)
Goto Top
Moin,

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}
}
Member: michi.wtr
michi.wtr Mar 22, 2023 at 15:06:42 (UTC)
Goto Top
Zitat von @chaot1coz:

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}
}

Also Invoke-Command rufe ich eigentlich nur einmal auf. Wenn ich auf meinem Rechner jetzt in PowerShell eingebe:
Invoke-Command -Credential admin -ScriptBlock {Test-Path \\ServerXX\geteilter\Ordner}
bekomme ich Zugriff verweigert, obwohl ich eigentlich Zugriff auf diesen Ordner habe, denn
Test-Path \\ServerXX\geteilter\Ordner
liefert true...

Auch den Pfad vorübergehend als Netzlaufwerk anzubinden funktioniert leider nicht... Ich binde den Pfad z.B. an Z: und sobald ich sage cd Z:\: Zugriff verweigert (nur mit Invoke-Command)
Mitglied: 3063370895
3063370895 Mar 22, 2023 updated at 15:26:09 (UTC)
Goto Top
Invoke-Command ist nur exemplarisch für einen zweiten Hop dargestellt.

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.
Member: michi.wtr
michi.wtr Mar 22, 2023 updated at 21:22:53 (UTC)
Goto Top
Zitat von @chaot1coz:

Invoke-Command ist nur exemplarisch für einen zweiten Hop dargestellt.

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.

Ich habe das gerade mal probiert, jedoch bekomme ich dabei folgende Exception:
Invoke-Command localhost -Cred $cred -ScriptBlock {Test-Path -Cred $using:cred \\Server..\...\....\}
error


Also habe ich probiert zuerst den PSDrive hinzuzufügen:
Invoke-Command localhost -Cred $cred -ScriptBlock {New-PSDrive -Name Z -Root \\Server...\....\....\ -PSProvider FileSystem}
error2

New-PSDrive ohne Credentials lässt mich zwar den Drive erstellen, jedoch kommt beim Aufruf auch bei Test-Path mit Credentials wieder genau die Exception:
error

und bei Test-Path ohne Credentials die ursprüngliche Zugriff verweigert Exception
Mitglied: 3063370895
3063370895 Mar 23, 2023 updated at 05:49:16 (UTC)
Goto Top
Ah dann unterstützt Test-Path kein Credential.

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
    }
}

?
Member: michi.wtr
michi.wtr Mar 23, 2023 at 07:09:27 (UTC)
Goto Top
Zitat von @chaot1coz:

Ah dann unterstützt Test-Path kein Credential.

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
    }
}

?

screenshot 2023-03-23 080741
Member: michi.wtr
michi.wtr Mar 23, 2023 at 08:04:37 (UTC)
Goto Top
Warum sich die Geräte unterschiedlich verhalten haben habe ich glaube ich herausgefunden:
printui /u = Nutze bereits installierte Druckertreiber, falls vorhanden face-smile
Weil ich auf meinem Notebook schon einige Druckertreiber installiert hatte, hat es mir auch weitaus mehr Drucker hinzugefügt als bei einem anderen Client.... Nach deinstallieren der Treiber verhalten sich nun die Clients auch gleich und installieren keinen Drucker Remote.

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.
Mitglied: 3063370895
Solution 3063370895 Mar 23, 2023 at 08:33:17 (UTC)
Goto Top
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.

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.
Member: michi.wtr
michi.wtr Mar 23, 2023 updated at 09:14:22 (UTC)
Goto Top
Zitat von @chaot1coz:

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.

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.

Ja das ist schon richtig, ich glaube ich werde wohl einfach die INF-Datei auf den Remote-PC kopieren, und dann von dort nutzen. Dann müsste ich halt zwei Credentials angeben, aber das geht dann.

Damit dürfte es dann gelöst sein, vielen lieben Dank dir :D

Nur eine letzte Frage hätte ich noch: Weißt du denn, warum Cmdlets wie Test-Path, Get-Item usw. einen Parameter Credential haben, wenn man diese nicht nutzen kann ^^ ?

help-credential

Wie ist das gemeint mit Invoke-Command? Ist es dafür, wenn mit Invoke-Command auf einem anderen PC bin und auf diesem dann noch einen Ordner prüfen möchte, für den der Benutzer mit dem ich mich verbinde keinen Zugriff hat? Um dann noch ein anderes Benutzerkonto mit den Rechten anzugeben?
Mitglied: 3063370895
3063370895 Mar 23, 2023 at 09:14:02 (UTC)
Goto Top
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