Pnputil.exe kann nicht mit PowerShell-Skript übertragen werden, das über MS Intune gepusht wird

838
YouGotServered

Ich habe seit mehreren Tagen Probleme, dieses Skript über Intune zum Laufen zu bringen. Das folgende Skript zeigt, ob ein Drucker installiert ist. Wenn nicht, wird der Treiber aus unserem Blob-Repository heruntergeladen, extrahiert und zum Treiberspeicher hinzugefügt. Anschließend wird der Drucker hinzugefügt.

Das Skript funktioniert einwandfrei, wenn es lokal ausgeführt wird. Wenn ich es jedoch über Intune an unsere Windows 10-Geräte übertrage, wird kein Drucker hinzugefügt. Intune sagt mir, dass das Skript auf den Zielgeräten nicht ausgeführt werden konnte. Ich bin mir jedoch nicht sicher, warum.

Das Skript versagt an der Zeile, die mit beginnt $pnpOutput, bis zum Abschluss der Zeile. Ist nach dieser Zeile add-printerporterfolgreich (Druckerport wird dem Computer hinzugefügt), nichts anderes jedoch, da für alle anderen Befehle der Treiber installiert werden muss, was jedoch nicht der Fall ist. Durch die Überprüfung C:\Windows\INFauf dem Zielcomputer wird bestätigt, dass der Treiber nicht zum Treiberspeicher hinzugefügt wurde.

Ich denke, das Problem hat etwas damit zu tun, wie ich pnputil.exemit Powershell anrufe. Ich habe versucht, den Befehl auf einige Arten ohne Ergebnis zu formulieren. Ich bin relativ neu bei Powershell, weiß aber genug, um ein paar Skripte zusammenzumachen und einige grundlegende Fehlerbehebungen durchzuführen.

Ich habe versucht, einige Fehlerprotokolle hinzuzufügen, war aber nicht erfolgreich. Ich habe versucht, out-filedie $pnpoutputZeile, aber die resultierende Datei war leer. Ich habe versucht, Try / Catch um den gesamten letzten Block hinzuzufügen, aber meine Protokolldatei wurde nicht einmal erstellt (auch nicht lokal), selbst wenn ich das Skript absichtlich brach, um einen Fehler zu verursachen.

# This script installs the US Bizhub C368 printer # This checks to see if the printer has already been added $CheckPrinter = Get-printer | where {$_.Name -like "US Bizhub C368"} If ($CheckPrinter -eq $null) {  # Make IT folder for driver download $ITFolder = "C:\IT" New-Item -Path $ITFolder -ItemType Directory  # Download the driver from Azure Blob repository $source = "OurAzureBlobURL.com" $zipdestination = "$ITFolder\USBizhubC368Driver.zip" Invoke-WebRequest $source -OutFile $zipdestination  # Extract the zip archive and delete the zip $unzippeddestination = "$ITFolder\USBizhubC368Driver" Expand-Archive -Path $zipdestination -DestinationPath $unzippeddestination Remove-Item -Path $zipdestination  $pnpOutput = pnputil -a "$unzippeddestination\KOAXWJ__.INF" | Select-String "Published name" $null = $pnpOutput -match "Published name :\s*(?<name>.*\.inf)" $driverINF = Get-ChildItem -Path C:\Windows\INF\$($matches.Name) Add-PrinterDriver -Name "KONICA MINOLTA C368SeriesPCL" -InfPath $driverINF.FullName Add-PrinterPort -Name "US Bizhub C368" -PrinterHostAddress "192.168.121.20" Add-Printer -Name "US Bizhub C368" -DriverName "KONICA MINOLTA C368SeriesPCL" -PortName "US Bizhub C368"  } 

Hat jemand irgendwelche Ideen? Wenn Sie wissen, wie die Protokollierung ordnungsgemäß ausgeführt wird, kann ich das gerne einrichten, es per Intune ansteuern und mit der Fehlermeldung zurückmelden. Powershell ist (noch) nicht meine Muttersprache, daher brauche ich vielleicht ein wenig gedämpfte Antworten :)

Vielen Dank!

0

1 Antwort auf die Frage

1
CraftyB

Ich habe meine Antwort komplett überarbeitet, nachdem ich mir andere Skripte angesehen habe, die dem entsprechen, was Sie unter Berücksichtigung von Intune erreichen möchten.

Bitte probieren Sie das unten:

# This script installs the US Bizhub C368 printer # This checks to see if the printer has already been added $CheckPrinter = Get-printer | where {$_.Name -like "US Bizhub C368"} If ($CheckPrinter -eq $null) {  # Make IT folder for driver download $ITFolder = "C:\IT" New-Item -Path $ITFolder -ItemType Directory  # Download the driver from Azure Blob repository $source = "OurAzureBlobURL.com" $zipdestination = "$ITFolder\USBizhubC368Driver.zip" Invoke-WebRequest $source -OutFile $zipdestination  # Extract the zip archive and delete the zip $unzippeddestination = "$ITFolder\USBizhubC368Driver" Expand-Archive -Path $zipdestination -DestinationPath $unzippeddestination Remove-Item -Path $zipdestination  if($env:PROCESSOR_ARCHITECTURE -eq "x86"){ Start-Process "$env:WINDIR\sysnative\windowspowershell\v1.0\powershell.exe" -WorkingDirectory $ITFolder -ArgumentList "pnputil /add-driver *.inf /subdirs /install | Out-File -FilePath (Join-Path $ITFolder '\Install-Drivers.txt')" -NoNewWindow -Wait } elseif($env:PROCESSOR_ARCHITECTURE -eq "AMD64"){ Start-Process "powershell.exe" -WorkingDirectory $ITFolder -ArgumentList "pnputil /add-driver *.inf /subdirs /install | Out-File -FilePath (Join-Path $ITFolder '\Install-Drivers.txt')" -NoNewWindow -Wait }  [String]$pnpOutput = Get-Content "$ITFolder\Install-Drivers.txt" | Select-String "Published Name" $pnpOutput -match "Published name:\s*(?<name>.*\.inf)" $driverINF = Get-ChildItem -Path C:\Windows\INF\$($matches.Name) Add-PrinterDriver -Name "KONICA MINOLTA C368SeriesPCL" -InfPath $driverINF.FullName Add-PrinterPort -Name "US Bizhub C368" -PrinterHostAddress "192.168.121.20" Add-Printer -Name "US Bizhub C368" -DriverName "KONICA MINOLTA C368SeriesPCL" -PortName "US Bizhub C368"  } 
Danke für die Antwort! Ich werde es versuchen und Bericht erstatten. Ich bin mir jedoch nicht sicher, ob das der Fall ist. Ich sage das, weil der Treiber eine Zeile darüber installiert werden soll ($ pnpOutput = pnputil -a "$ unzippeddestination \ KOAXWJ __. INF" | Select-String "Published name"), aber er wird nicht einmal installiert, wenn Sie durch Intune geschoben werden . Die zwei Zeilen unter dieser Zeile helfen uns nur, den Namen des Treibers herauszufinden, sobald er installiert ist, damit wir ihn an add-printerdriver übergeben können. Wenn Sie einen Fehler in meiner Logik sehen, weisen Sie bitte darauf hin, ich bin hier, um zu lernen! YouGotServered vor 5 Jahren 0
Entschuldigungen, die ich erst hinterher im intimen Element Ihrer Frage gefunden hatte. Ich habe zwar keine Erfahrung mit intune, aber mit der Treiberinstallation. Wie testen Sie, ob pnputil funktioniert? Wenn Sie eine Variable deklarieren, kann es sein, dass die Ausgabe in eine Datei nicht zulässig ist. Es kann sich lohnen, die Variable auszulesen und die Ausgabe von pnputil entweder direkt mit out-file / an die Zeile mit "> somedestination \ pnputil.txt" zu übergeben. CraftyB vor 5 Jahren 0
Keine Bange! Zur Bestätigung habe ich das überarbeitete Skript mit Ihrem ersten Vorschlag und ohne Würfel durchgespielt. YouGotServered vor 5 Jahren 0
Ich teste pnputil, indem ich das Skript lokal ausführe und dann vergewissere, dass der OEM ##. Inf in Windows vorhanden ist und dass ich mit der $ driverinf -Variable erfolgreich "add-printerdriver" hinzufügen kann. Wenn das Skript über Intune auf einem Gerät ausgeführt wird, wird die INF-Datei leider nie in C: \ Windows \ INF angezeigt. Der extrahierte Inhalt befindet sich jedoch im IT-Ordner und der Port wurde durch "add-printerport" erfolgreich hinzugefügt. Von diesem Beweis aus kann ich davon ausgehen, dass alles im Skript funktioniert, mit Ausnahme von pnputil.exe. YouGotServered vor 5 Jahren 0
Ich versuche `pnputil -a" $ unzippeddestination \ KOAXWJ __. INF "| Select-String "Published name" | out-file c: \ IT \ Printerlog.txt`, um zu sehen, ob ich Daten davon erhalten kann. Ich melde mich so schnell wie möglich. YouGotServered vor 5 Jahren 0
Können Sie einen Link für denselben Treiber erstellen ?, habe ich beim Testen ein paar Zeilen geändert. Ich nahm an, dass Sie die Dateien zuvor extrahiert und erneut geladen haben. CraftyB vor 5 Jahren 0
Da mir Intune nicht vertraut ist und ich nicht weiß, ob dies eine andere Sache sein könnte, würde ich in Betracht ziehen, einen vollständigen Weg zu pnputil zu erklären. Es darf keine Umweltpfade verwenden? CraftyB vor 5 Jahren 0
Die Out-Datei gab also genau das aus, was ich erwartet hatte, als sie lokal ausgeführt wurde: `Published name: oem71.inf`, die Out-Datei wurde jedoch nicht erstellt, als sie durch Intune ging. Es sieht so aus, als würde pnputil in einer separaten Instanz ausgeführt, die keinen Zugriff auf die ersten Variablen hat (oder etwas ähnliches, aber ich könnte mich irren). Hier sind die Dateien, die ich verwende: https://www.dropbox.com/s/bvxirufwac0vebm/USBizhubC368Driver.zip?dl=0 Ich werde versuchen, den vollständigen Pfad zu deklarieren und erneut zu drücken. Ich habe mehrere andere Intune PS-Skripts, die andere Software installieren (keine Treiber), also ist dies ungerade! YouGotServered vor 5 Jahren 0
Okay, also bearbeitete ich die erste pnputil-Zeile so, nur um zu sehen, ob wir sehen konnten, was los war: `C: \ Windows \ System32 \ pnputil.exe -a" $ unzippeddestination \ KOAXWJ __. INF "| out-file C: \ IT \ Printerlog.txt` und in diesem Ordner wurde kein Protokoll erstellt. Ich habe das Skript lokal ausgeführt, es hat das Protokoll erstellt und eine pnputil-Ausgabe erzeugt. Ich bin verblüfft Wenn dies alles hilft, führt Intune diese Skripts standardmäßig im Systemkontext aus. Ich könnte den Benutzerkontext ausprobieren, wenn Sie denken, dass sich das lohnt, aber ich bin mir nicht sicher, was Pnputil mag und nicht mag. YouGotServered vor 5 Jahren 0
Die Antwort wurde aktualisiert, nachdem ein anderes Skript ähnlich dem angezeigt wurde, das Sie [GitHub Source] (https://github.com/SCConfigMgr/Intune/blob/master/Driver%20Automation/Invoke-MSIntuneDriverUpdate.ps1) erreichen möchten Neueste Commits zeigen die if / elseif-Anweisung, die ich kopiert und geändert habe. CraftyB vor 5 Jahren 0
Ausgezeichnet! Vielen Dank, das hat hervorragend funktioniert! Haben Sie eine Idee, warum wir die Befehle auf diese Weise ausführen mussten, wenn Sie durch Intune schieben, aber nicht, wenn Sie lokal arbeiten? YouGotServered vor 5 Jahren 0
Ohne mehr in die Intune zu schauen, kann ich keine genaue Antwort geben (dies ist etwas, das ich in Erwägung ziehe, da wir in unserer Umgebung mobile Geräte haben, die ich gerne ferngesteuert ausführen könnte, ohne vpn durchsetzen zu müssen) In dem Kontext, in dem es ausgeführt wird, läuft es nur aus dem Benutzerkontext. Ich denke, es hätte Probleme mit dem Administrator, aber der Teil des Skripts, das ich kopiert hatte, hatte Powershell als Administrator im Benutzerkontext aus dem Systemkontext (Startprozess) ausgeführt. CraftyB vor 5 Jahren 0
Wenn Sie beabsichtigen, den IT-Ordner auf Systemen zu verwenden, um mehrere Treibersätze zu verwenden, sollten Sie die oben genannten Einstellungen so anpassen, dass der pnputil nicht rekursiv nach inf-Dateien sucht. Dies könnte zu einigen Problemen führen, wenn Sie nach "Published Name" suchen. Dies kann zu Problemen führen, wenn mehrere Namen aufgelistet werden. Ich bin froh, dass das oben für Sie gearbeitet hat und Ihr Willkommen :) CraftyB vor 5 Jahren 0
Macht Sinn. Ich habe auch das Skript als Ziel für das spezifische INF-Ziel festgelegt, da ich das immer vorher herausfinden kann. Danke nochmal für deine Hilfe! YouGotServered vor 5 Jahren 0