PowerShell StartProcess: неверный дескриптор

JNotelddim спросил: 12 мая 2018 в 05:15 в: powershell

Я пытаюсь установить google chrome на удаленную машину через powershell. Это то, что я пытаюсь сделать (я довольно просто скрепил это вместе из нескольких других сообщений на разных сайтах):

$Path = $env:TEMP; $Installer = "chrome_installer.exe";(new-object System.Net.WebClient).DownloadFile('http://dl.google.com/chrome/install/375.126/chrome_installer.exe', "$Path\$Installer");Start-Process -FilePath $Path\$Installer -Args "/silent /install" -Verb RunAs -Wait;Remove-Item $Path\$Installer 

он не работает в четвертой строке: Start-Process -FilePath $Path\$Installer -Args "/silent /install" -Verb RunAs -Wait;

с ошибкой:

Start-Process : This command cannot be run due to the error: The handle is 
 invalid.
At line:1 char:2
+  Start-Process -FilePath $Path\$Installer -Args "/silent /install" -V ...
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOp 
   erationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.C 
   ommands.StartProcessCommand

Я довольно неопытен с PowerShell, и мне сложно понять, что такое "дескриптор" в ошибке. Любая помощь приветствуется:)

EDIT: с try/catch { $_ | FL * -Force} вокруг команды failing он дает этот результат:

PSMessageDetails      : 
Exception             : System.InvalidOperationException: This command cannot 
                        be run due to the error: The handle is invalid.
                           at System.Management.Automation.MshCommandRuntime.Th
                        rowTerminatingError(ErrorRecord errorRecord)
TargetObject          : 
CategoryInfo          : InvalidOperation: (:) [Start-Process], 
                        InvalidOperationException
FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands
                        .StartProcessCommand
ErrorDetails          : 
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 4
PipelineIterationInfo : {}

С улавливанием $ _. Исключение вместо этого дает:

Message        : This command cannot be run due to the error: The handle is 
             invalid.
Data           : {}
InnerException : 
TargetSite     : Void ThrowTerminatingError(System.Management.Automation.ErrorR
                 ecord)
StackTrace     :    at System.Management.Automation.MshCommandRuntime.ThrowTerm
                 inatingError(ErrorRecord errorRecord)
HelpLink       : 
Source         : System.Management.Automation
HResult        : -2146233079

3 ответа

user188737 ответил: 13 мая 2018 в 06:01

Для сценария потребуется высота. Чтобы прочитать о удаленной высоте: https://ss64.com/ps/syntax-elevate.html

Если вы используете Invoke-Command для запуска скрипта или команды на удаленном компьютере, тогда это будет не выполняйте повышение, даже если локальный сеанс is.This, потому что любое приглашение для повышения будет происходить на remotemachine в неинтерактивном сеансе, и поэтому не удастся.

Использование Enter-PSSession для запуска целого нового сеанса будет поддерживать поддержку, если вы укажете CredSSP, который позволяет делегировать usercredentials:

New-PSSession ss64dom.com -Auth CredSSP -cred ss64dom\user64

Сценарий может быть затруднен маркером идентификатора интернет-зоны .

Источник: http://woshub.com/how-windows-determines-that-the-file-has-been-downloaded-from-the-internet/

В PowerShell 3.0 вы можете отобразить список файлов с потоком Zone.Identifier в каталоге с помощью этой команды:

Get-ChildItem -Recurse | Get-Item -Stream Zone.Identifier -ErrorAction SilentlyContinue | Select-Object FileName

Атрибут удаляется как следует:

Remove-Item .\install-file.exe -Stream Zone.Identifier

В Windows PowerShell 4.0 вы можете удалить Zone.Identifier, используя ase Параметр:

Unblock-File install-file.exe

Приложение: Remove-Item будет вызывать ошибку, если он не найдет альтернативный поток. Поэтому используйте:

Remove-Item $Path\$Installer -Stream Zone.Identifier -ErrorAction SilentlyContinue

JNotelddim ответил: 12 мая 2018 в 07:41
Я пытаюсь получить идентификатор зоны для файла, о котором идет речь, но первая цепочка команд, которые вы предложили, отключила powershell. вот что я сейчас делаю: Get-ChildItem .\chrome_installer.exe | Get-Item -Stream Zone.Identifier ошибка, которую я получил: Get-Item : Could not open the alternate data stream 'Zone.Identifier' of the file D:\home\site\wwwroot\chrome_installer.exe.
JNotelddim ответил: 12 мая 2018 в 07:43
Когда я пытаюсь: Get-Item .\chrome_installer.exe -Stream Zone.Identifier Get-Item .\chrome_installer.exe -Stream Zone.Identifier Это дает мне ту же ошибку. в конце ошибки говорится: `FullyQualifiedErrorId: AlternateDataStreamNotFound, Microsoft.PowerShell .Commands.GetItemCommand` Я просто не вставлял его в последний комментарий, потому что было слишком много символов
user188737 ответил: 12 мая 2018 в 08:03
После первого разблокирования кажется, что Windows запоминает разблокировку, а затем нет альтернативного потока.
user188737 ответил: 12 мая 2018 в 08:35
Вы все еще получаете ту же ошибку? Я не могу воспроизвести его, похоже, с этим связана локализованная проблема. Попробуйте установить -WorkingDirectory в Start-Process. Если вы пройдете мимо, вам придется посмотреть на высоту, потому что установщик попросит возвышения, даже с помощью / silent.
JNotelddim ответил: 12 мая 2018 в 08:26
то я предполагаю, что справедливо предположить, что это не проблема с идентификатором зоны, если он уже разблокирован?
Есть решение
JNotelddim ответил: 18 мая 2018 в 07:47

Насколько я могу судить, дело доходит до того, что в среде Azure Web App у вас нет прав на бесплатное установку приложений.

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

Подробнее об этом можно узнать здесь:

https://docs.microsoft.com/en-us/azure/app-service / выбрать-веб-сайт-облако-сервис-ут

Theo ответил: 12 мая 2018 в 06:25

попробуйте выполнить двойное цитирование файла FilePath, который вы загружаете в команду Start-Process, или используйте $(Join-Path $Path $Installer)

. Теперь вы ускользаете от установщика $ for $, поэтому путь к файл не может быть разрешен.

Start-Process -FilePath "$Path\$Installer" -Args "/silent /install" -Verb RunAs -Wait;# OR (even better I think)Start-Process -FilePath $(Join-Path $Path $Installer) -Args "/silent /install" -Verb RunAs -Wait;
TheIncorrigible1 ответил: 12 мая 2018 в 06:25
`\` не является символом escape в PowerShell.
Theo ответил: 12 мая 2018 в 06:26
просто введите это в ISE: $ Path = $ env: TEMP $ Installer ="chrome_installer.exe" $ Path \ $ Installer, если вы запустите его, вы получите сообщение об ошибке Неожиданный токен
TheIncorrigible1 ответил: 12 мая 2018 в 06:29
Это потому, что это не интерпретируется как строка в командной строке, но IS интерпретируется как строка в качестве аргумента для параметра ...
Theo ответил: 12 мая 2018 в 06:34
Кроме того, это плохая практика, чтобы попытаться установить что-либо из папки Temp
EBGreen ответил: 12 мая 2018 в 06:37
как указано в TheIncorrigible1, \ не является escape-последовательностью в powershell. Если вы сделаете это: $path = $env:temp; $installer = "chrome_installer.exe"; $path\$installer, вы получите сообщение об ошибке просто потому, что есть неожиданный токен. Если вы это сделаете: Write-host -Object $path\$installer Вы получите этот вывод: C:\Users\username\AppData\Local\Temp\chrome_installer.exe Итак, как вы видите, при использовании в качестве параметра интерпретатор объединяет две переменные. Кстати, не просто предположите, но попробуйте сначала. ,,