ralus67
Goto Top

Mit Powershell Drucker hinzufügen

Hallo Community

Ich versuche über Powershell einen Drucker zu erstellen. Leider wird das Druckerobjekt nicht erstellt.
Was könnte an meinem Skript falsch sein?

Invoke-Command -ComputerName $env:computername -Scriptblock {rundll32 printui.dll,PrintUIEntry /dl /n "DYMO LabelWriter 450 Twin Turbo"}
Invoke-Command -ComputerName $env:computername -Scriptblock {Cscript C:\Windows\System32\Printing_Admin_Scripts\de-DE\prnport.vbs -a -r IP_192.168.33.53 -h 192.168.33.53 -o raw -n 9100}
Start-Sleep -Seconds 5
Invoke-Command -ComputerName $env:computername -Scriptblock {rundll32 printui.dll,PrintUIEntry /if /b "DYMO LabelWriter 450 Twin Turbo" /f "$PSScriptRoot\Drivers\DYMO.inf" /r "IP_192.168.33.53" /m "DYMO LabelWriter 450 Twin Turbo"}


Im Voraus vielen Dank für Eure Hilfe
Ralus67

Content-ID: 638569

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

Ausgedruckt am: 19.11.2024 um 06:11 Uhr

Ralus67
Ralus67 07.01.2021 um 12:08:12 Uhr
Goto Top
Als weitere Info. Die Treiber sowie der Port mit definierter IP-Adresse werden installiert bzw. erstellt.

Lediglich der letzte Befehl
Invoke-Command -ComputerName $env:computername -Scriptblock {rundll32 printui.dll,PrintUIEntry /if /b "DYMO LabelWriter 450 Twin Turbo" /f "$PSScriptRoot\Drivers\DYMO.inf" /r "IP_192.168.33.53" /m "DYMO LabelWriter 450 Twin Turbo"}

erstellt mir kein Drucker Objekt.

Führe ich jedoch den Befehl in einer cmd aus, dann funktioniert es.
rundll32 printui.dll,PrintUIEntry /if /b "DYMO LabelWriter 450 Twin Turbo" /f "$PSScriptRoot\Drivers\DYMO.inf" /r "IP_192.168.33.53" /m "DYMO LabelWriter 450 Twin Turbo"

Hat jemand eine Lösung?
mayho33
mayho33 07.01.2021 aktualisiert um 12:50:53 Uhr
Goto Top
Zitat von @Ralus67:

Hallo Community

Ich versuche über Powershell einen Drucker zu erstellen. Leider wird das Druckerobjekt nicht erstellt.

Wen es in CMD so funktioniert, dann übergib das ganze doch einfach an die Comspec:

$toInvoke = ("/c $($env:computername) rundll32 printui.dll,PrintUIEntry /if /b " + [char]34 + "DYMO LabelWriter 450 Twin Turbo" + [char]34 + " /f $PSScriptRoot\Drivers\DYMO.inf /r IP_192.168.33.53 /m " + [char]34 + "DYMO LabelWriter 450 Twin Turbo" + [char]34)  

$pinfo                 = New-Object System.Diagnostics.ProcessStartInfo
$p                     = New-Object System.Diagnostics.Process
$pinfo.UseShellExecute = $false
$pinfo.FileName        = "cmd.exe"  
$pinfo.Arguments       = $toInvoke
    

$p.StartInfo = $pinfo
$p.Start() | Out-Null


Noch ein kleiner Hinweis:

pnputil installiert dir für alle Benutzer den Treiber. Du könntest also die Installation der Treiber und das Anlegen des Druckers aufteilen:

$pinfo                 = New-Object System.Diagnostics.ProcessStartInfo
$p                     = New-Object System.Diagnostics.Process
$pinfo.UseShellExecute = $false
$pinfo.FileName        = "cmd.exe"  
$pinfo.Arguments       = "/c pnputil -i -a " + [char]34 + "meinPfad\*.inf" + [char]34  
    

$p.StartInfo = $pinfo
$p.Start() | Out-Null
Grüße!
Ralus67
Ralus67 07.01.2021 um 13:13:42 Uhr
Goto Top
Hallo Mayho33

Leider funktioniert das Sript nicht. Ich habe es folgendermassen implementiert.

Invoke-Command -ComputerName $env:computername -Scriptblock {Cscript C:\Windows\System32\Printing_Admin_Scripts\de-DE\prnport.vbs -a -r IP_192.168.33.53 -h 192.168.33.53 -o raw -n 9100}

Start-Sleep -Seconds 5

$toInvoke = ("/c $($env:computername) rundll32 printui.dll,PrintUIEntry /if /b " + [char]34 + "DYMO LabelWriter 450 Twin Turbo" + [char]34 + " /f $PSScriptRoot\Drivers\DYMO.inf /r IP_192.168.33.53 /m " + [char]34 + "DYMO LabelWriter 450 Twin Turbo" + [char]34)

$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$p = New-Object System.Diagnostics.Process
$pinfo.UseShellExecute = $false
$pinfo.FileName = "cmd.exe"
$pinfo.Arguments = $toInvoke


$p.StartInfo = $pinfo
$p.Start() | Out-Null
mayho33
mayho33 07.01.2021 um 13:18:19 Uhr
Goto Top
Zitat von @Ralus67:
Leider funktioniert das Sript nicht. Ich habe es folgendermassen implementiert.

Sollte ja nur ein Example sein. face-wink
Ralus67
Ralus67 07.01.2021 aktualisiert um 13:36:10 Uhr
Goto Top
Irgendwo ist hier ein Fehler im Skript

Da wird nichts ausgeführt.


Verb :
Arguments : /c AS01-LAB rundll32 printui.dll,PrintUIEntry /if /b "DYMO LabelWriter 450 Twin Turbo" /f
C:\Temp\Dymo_LabelWriter450_8.3.0.443_001\Deploy\P_ML_x99\Drivers\DYMO.inf /r IP_192.168.33.53 /m "DYMO LabelWriter 450 Twin Turbo"
CreateNoWindow : False
EnvironmentVariables : {Path, PROCESSOR_IDENTIFIER, TEMP, ProgramW6432...}
Environment : {[Path, C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\myNet\;C:\Users\Ralus\AppData\Local\Microsoft\WindowsApps], [PROCESSOR_IDENTIFIER, Intel64 Family 6 Model 94 Stepping 3, GenuineIntel], [TEMP,
C:\Users\Ralus\AppData\Local\Temp], [ProgramW6432, C:\Program Files]...}
RedirectStandardInput : False
RedirectStandardOutput : False
RedirectStandardError : False
StandardErrorEncoding :
StandardOutputEncoding :
UseShellExecute : False
Verbs : {open, runas, runasuser}
UserName :
Password :
PasswordInClearText :
Domain :
LoadUserProfile : False
FileName : cmd.exe
WorkingDirectory :
ErrorDialog : False
ErrorDialogParentHandle : 0
WindowStyle : Normal


PS C:\WINDOWS\system32> echo $p

Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0 0


PS C:\WINDOWS\system32>
mayho33
mayho33 07.01.2021 um 14:06:35 Uhr
Goto Top
Schau die mal diese CmdLets an:

https://docs.microsoft.com/en-us/powershell/module/printmanagement/add-p ...

https://docs.microsoft.com/en-us/powershell/module/printmanagement/add-p ...

Wenn du also mal den Treiber bereitgestellt hast (als Admin natürlich), dann sollte das Erstellen eines Druckers kein Problem sein.

Etwas Übung muss halt schon sein.

Was genau willst mit...
echo $p
...bewirken ?

Powershell gibt alles, auch einen simplen String, zuerst mal in einem Object zurück.
Es würde also reichen in der PS einfach nur das zu machen:
$p

Das wirst du aber nicht viel sehen. Hingegen listet $p.Startinfo alle StartParamter

Willst du wissen ob nach der Ausführung alles OK war Kannst du auf das Ende des Processes warten:
$p.WaitForExit()
und anschließend den ExitCode anschauen:
$p.ExitCode()

System.Diagnostics.Process kann System.Diagnostics.ProcessStartInfo übergeben werden. In System.Diagnostics.ProcessStartInfo legst du alle Paramter fest die für dich wichtig sind.

das sind minimum 3:
  • UseShellExecute = $false
  • FileName = die exe die du starten willst, also cmd.exe
  • Arguments = die Argumente die du der Exe übergeben willst

Da cmd.exe mal wissen muss, wie es sich verhalten soll (offen bleiben oder nicht nach Ausführung) => "/c" (beutet nach Ausführung schließen)
du willst das cmd.exe was für dich macht? Dann sag ihr was:

pnpuitil -a -i "pfad zu einer inf-Datei" (pnputil liegt in C:\Windows\system32 und ist fester Bestandteil von W10) pnputil hat auch Argumente die man angeben kann/muss.

Du übergibst also sogar 2 Befehle. Einmal die Exe die gestartet werden soll, die Argumente für dieses Exe und einen Befehl der mit der Exe ausgeführt werden soll (pnputil ....)

Schau dir mal an was pnputil so kann und macht;
pnputil /?

Schau dir auch an was cmd.exe so kann und macht;
cmd /?

In dem Beispiel musst du mal den Pfad zu deiner INF anpassen:
$pinfo                 = New-Object System.Diagnostics.ProcessStartInfo
$p                     = New-Object System.Diagnostics.Process
$pinfo.UseShellExecute = $false
$pinfo.FileName        = "cmd.exe"  
$pinfo.Arguments       = "/c pnputil -i -a " + [char]34 + "meinPfad\*.inf" + [char]34  
    

$p.StartInfo = $pinfo
$p.Start() | Out-Null