Невозможно заставить pnputil.exe функционировать в сценарии PowerShell, передаваемом через MS Intune.

870
YouGotServered

Я изо всех сил пытался заставить этот скрипт работать через Intune в течение нескольких дней. Ниже приведен скрипт, который проверяет, установлен ли принтер, если нет, драйвер загружается из нашего хранилища BLOB-объектов, извлекается, добавляется в хранилище драйверов, а затем добавляется принтер.

Сценарий отлично работает при локальном запуске, однако, когда я отправляю его через Intune на наши устройства Windows 10, принтер не добавляется, и Intune сообщает мне, что скрипт не удалось запустить на целевых устройствах, но я не уверен, почему.

Сценарий $pnpOutputзавершается с ошибкой в ​​строке, начинающейся со строки, вплоть до завершения этой строки. После этой строки add-printerportуспешно (порт принтера добавляется на компьютер), но больше ничего не происходит, потому что все другие команды требуют установки драйвера, а это не так. Проверка C:\Windows\INFна целевом компьютере подтверждает, что драйвер не был добавлен в хранилище драйверов.

Я полагаю, что проблема как-то связана с тем, как я звоню pnputil.exeс powershell. Я попытался сформулировать команду несколькими способами без результата. Я довольно новичок в powershell, но знаю достаточно, чтобы объединить несколько сценариев и выполнить некоторые базовые действия по устранению неполадок.

Я попытался добавить некоторые сообщения об ошибках, но безуспешно. Я попытался out-fileв $pnpoutputстроке, но полученный файл был пуст. Я попытался добавить попытку / перехватить весь последний блок, но мой файл журнала даже не был создан (даже локально, даже когда я специально сломал скрипт, чтобы вызвать ошибку).

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

У кого-нибудь есть какие-либо идеи? Я готов к пробам и ошибкам, поэтому, если вы знаете, как правильно вести запись, я с удовольствием настрою это, отправлю через Intune и сообщу об ошибке. Powershell - не мой родной язык (пока), поэтому, возможно, мне понадобятся ответы, которые немного ошарашены, если это возможно :)

Спасибо!

0

1 ответ на вопрос

0
CraftyB

Я полностью пересмотрел свой ответ после просмотра других сценариев, которые делают то же, что вы хотите достичь, принимая во внимание intune.

Пожалуйста, попробуйте ниже:

# 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"  } 
Спасибо за ответ! Я дам ему шанс и доложу. Однако я не уверен, что это проблема. Я говорю это потому, что драйвер должен быть установлен на одну строку выше (`$ pnpOutput = pnputil -a" $ unzippeddestination \ KOAXWJ __. INF "| Select-String" Опубликованное имя "`), но он даже не устанавливается, когда проталкивается через Intune , Две строки под этой строкой просто помогают нам определить имя драйвера после его установки, чтобы мы могли передать его в add-printerdriver. Если вы видите ошибку в моей логике, пожалуйста, укажите на это, я здесь, чтобы учиться! YouGotServered 5 лет назад 0
Извинения, которые я только потом поднял на интуитивный элемент вашего вопроса. Хотя у меня нет опыта работы с Intune, я делаю установку драйверов. Как вы тестируете, что pnputil работает? Если вы объявляете переменную, она может не разрешить вывод в файл, возможно, стоит удалить переменную и передать вывод pnputil напрямую либо с помощью out-file / добавив строку с "> somedestination \ pnputil.txt" CraftyB 5 лет назад 0
Не волнуйтесь! Просто чтобы подтвердить, я выдвинул пересмотренный сценарий с вашим первым предложением, а не с кубиками. YouGotServered 5 лет назад 0
Я тестирую pnputil, выполняя скрипт локально, а затем проверяю, что OEM ##. Inf присутствует в Windows и что я могу `add-printerdriver` успешно использовать переменную` $ driverinf`. К сожалению, когда скрипт запускается через Intune на устройстве, INF никогда не отображается в C: \ Windows \ INF, однако извлеченное содержимое находится в папке IT, и `add-printerport` успешно добавил порт. Исходя из этих доказательств, я могу предположить, что все в сценарии работало, за исключением pnputil.exe. YouGotServered 5 лет назад 0
Я попробую `pnputil -a" $ unzippeddestination \ KOAXWJ __. INF "| Select-String "Опубликованное имя" | out-file c: \ IT \ Printerlog.txt`, чтобы посмотреть, смогу ли я получить некоторые данные из этого. Я доложу как можно скорее. YouGotServered 5 лет назад 0
Можете ли вы поставить ссылку на тот же драйвер? Я изменил несколько строк при тестировании ранее. Я предположил, из-за имени вы извлекли файлы ранее и разархивировали. CraftyB 5 лет назад 0
Так как я не знаком с intune и не знаю, может ли это быть связано, я бы посоветовал объявить полный путь к pnputil. Может не использовать экологические пути? CraftyB 5 лет назад 0
Таким образом, out-файл выводил именно то, что я ожидал при локальном запуске: `Опубликованное имя: oem71.inf`, однако out-файл даже не создавался при прохождении через Intune. Кажется, что он запускает pnputil в отдельном экземпляре, который не имеет доступа к переменным первого (или что-то в этом роде, но я могу ошибаться). Вот файлы, которые я использую: https://www.dropbox.com/s/bvxirufwac0vebm/USBizhubC368Driver.zip?dl=0 Я попытаюсь объявить полный путь и повторно нажать. У меня есть несколько других скриптов Intune PS, которые отлично устанавливают другое программное обеспечение (без драйверов), так что это странно! YouGotServered 5 лет назад 0
Хорошо, поэтому я отредактировал первую строку pnputil именно для этого, просто чтобы посмотреть, сможем ли мы поймать, что происходит: `C: \ Windows \ System32 \ pnputil.exe -a" $ unzippeddestination \ KOAXWJ __. INF "| out-файл C: \ IT \ Printerlog.txt`, и в этой папке не было создано журнала. Я запустил скрипт локально, и он сделал лог и выдал вывод pnputil. Я в тупике. Если это помогает, Intune запускает эти сценарии в системном контексте по умолчанию. Я мог бы попробовать пользовательский контекст, если вы считаете, что это того стоит, но я не уверен, что pnputil любит и не любит. YouGotServered 5 лет назад 0
Ответ был обновлен после того, как он увидел другой сценарий, похожий на тот, который вы пытаетесь достичь [Источник GitHub] (https://github.com/SCConfigMgr/Intune/blob/master/Driver%20Automation/Invoke-MSIntuneDriverUpdate.ps1), их самые новые коммиты показывают оператор if / elseif, который я скопировал и изменил. CraftyB 5 лет назад 0
Отлично! Спасибо большое, что сработало блестяще! Любая идея, почему мы должны были запускать команды таким образом при проталкивании через Intune, а не при локальном запуске? YouGotServered 5 лет назад 0
Не углубляясь в intune, я не могу дать точный ответ (это то, что я собираюсь использовать, поскольку у нас есть мобильные устройства в нашей среде, которые я хотел бы иметь возможность выполнять удаленно без необходимости применения vpn), однако мои мысли вокруг контекст, в котором он выполняется, запускается только из пользовательского контекста. Думаю, у него возникнут проблемы с повышением прав администратора, однако часть сценария, который я скопировал, выполняла powershell как администратор в контексте пользователей из системного контекста (start-process). CraftyB 5 лет назад 0
Если вы намерены использовать папку IT в системах, чтобы иметь несколько наборов драйверов, я бы рассмотрел настройку вышеупомянутого, чтобы pnputil не осуществлял рекурсивный поиск файлов inf, это могло бы вызвать некоторые проблемы, наряду с поиском лучшего способа поиска «Опубликованного имени» так как это может вызвать проблемы, если он перечисляет несколько имен. Рад, что вышесказанное сработало для вас и приветствуется :) CraftyB 5 лет назад 0
Имеет смысл. Я также пошел вперед и сделал скрипт нацеленным на конкретный INF, который я ищу, так как я всегда могу это выяснить заранее. В очередной раз благодарим за помощь! YouGotServered 5 лет назад 0

Похожие вопросы