Сценарий удаленного Powershell не может установить .exe

РЕДАКТИРОВАТЬ2: ** После долгого тестирования и чтения я понял, что это ограничение среды Powershell. (подробнее здесь < / а>). Я решил проблему, запустив .exe как задачу через schtasks.exe **

РЕДАКТИРОВАТЬ: после долгого тестирования проблема, похоже, возникает из-за разницы между удаленной PowerShell и локальной PowerShell ... Проблема все еще не решена, поэтому любая помощь более чем приветствуется!

Я пытаюсь сделать что-то довольно простое, но это у меня просто не работает.

У меня 2 машины, MachineA и MachineB. Оба работают под управлением PowerShell v2 и являются надежными источниками друг друга с включенным удаленным взаимодействием.

Я пытаюсь запустить сценарий на MachineB через MachineA с помощью этой команды:

invoke-command -computername MachineB { C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -executionpolicy Bypass Script.ps1 }

Сам сценарий пытается установить файл .exe, для которого предусмотрена установка без вывода сообщений (на основе файла конфигурации в его каталоге):

$arguments = "-i silent"
$InstallerPath = "Setup.exe" 
Start-Process $InstallerPath5 $arguments5 -verb runas

Когда я запускаю сценарий локально на MachineB - все работает нормально, и установка завершается успешно. Однако, когда я запускаю сценарий удаленно (с помощью 1-й команды из MachineA), он сразу же завершается, и ничего не происходит - установщики вообще не открываются в диспетчере задач на MachineB. Никаких ошибок и журналов нет.

Как ни странно, когда я меняю фактический сценарий на «& C: \ Windows \ system32 \ cmd.exe / c Setup.exe -i silent» и запускаю его удаленно, установка запускается, работает в течение 5-6 секунд на 50% процессоре. загрузка, а затем падает до 0% и зависает навсегда. Опять же, если я запускаю его локально, все работает отлично ...

Если попробовали:

  • Удаленный запуск установщика напрямую (например, через invoke-command { & Setup.exe -i })
  • Редактирование скрипта для запуска без Start-Process (например, & Setup.exe -i)
  • Перемещение скрипта на MachineA и его удаленный запуск на MachineB (например, invoke-command -filename sciprt.ps1 -computername MachineB)

Все это работает, если я делаю это локально на MachineB, но ничего не работает, если выполняется удаленно через MachineA (хотя и с другими проблемами)? Я схожу с ума.

Я также проверил, есть ли у пульта ДУ права администратора:

([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")

Возвращает True. Кроме того, я могу удаленно редактировать реестр HKLM, поэтому я предполагаю, что он работает.

Здесь приветствуются любые идеи!


person Petar    schedule 07.01.2015    source источник
comment
Ваш установщик что-нибудь записывает? Вы можете настроить его для входа в систему? Я не вижу полного пути, указанного для -FilePath при запуске. Это просто запутано для цели вопроса или в том же каталоге, что и сценарий? Заставляет меня задаться вопросом, проблема ли в пути к exe   -  person Matt    schedule 07.01.2015
comment
Привет, Мэтт, это запутано для целей сценария. Путь к exe верен (а точнее путь D: \ Installers \ IBM \ EMM_Installer.exe). Кажется, я не могу заставить его регистрировать что-либо - похоже, у exe нет функции -help: / Единственные параметры, которые он принимает, - это -i silent и -i console (для ручной установки консоли) ...   -  person Petar    schedule 08.01.2015
comment
Не для того, чтобы слишком сильно увлекаться, но регистрирует ли Windows что-нибудь для этого? Этот путь правильный относительно удаленного компьютера?   -  person Matt    schedule 08.01.2015
comment
Привет, Мэтт, я не могу найти ничего подходящего в журналах :-( Есть какой-нибудь конкретный журнал, который вы имеете в виду? Я попробовал что-то еще: New-PSSession -cn MachineB, а затем запустил сценарий через удаленный сеанс с помощью `& D: \ Installers \ IBM \ EMM_Installer.exe '... Таким образом, процесс запускается, но снова через несколько секунд зависает при 0% использовании процессора и некотором использовании памяти ... и ничего не происходит, он просто остается там. Я также сразу после его убийства запускаю сценарий локально на MachineB и все установлено правильно .. Думаю, тут может быть 2 проблемы, но основная возникает из-за того, что   -  person Petar    schedule 08.01.2015
comment
что удаленные сеансы имеют что-то отличное от локальных, что приводит к зависанию установщика ?! Думаю, в этом проблема ..   -  person Petar    schedule 08.01.2015
comment
Еще 1 совет: [MachineB]: PS C:\Users\p_lafchiev\Documents> ([Security.Principal.WindowsPrincipal] [Security.Princi pal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator") True Однако, если я запускаю Get-PSSessionConfiguration через тот же удаленный сеанс, я получаю: Access is denied. + CategoryInfo : + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShell.Commands.GetChildItemCommand Это проблема администратора? Я запуталась?   -  person Petar    schedule 08.01.2015


Ответы (2)


После долгого тестирования и чтения я понял, что это "загвоздка среды" ограничения PowerShell. (подробнее здесь < / а>). Я решил проблему, запустив .exe как задачу через schtasks.exe

person Petar    schedule 08.01.2015

Я сейчас играю с этим. Я много занимаюсь удаленным подключением и установкой программного обеспечения на пару сотен машин. У нас возникла проблема, из-за которой Java пользователей удалялась при каждой перезагрузке. В любом случае, вероятно, потребуется 2-5 минут, чтобы получить от них имя машины и затем установить программное обеспечение. Я написал этот небольшой фрагмент (все еще в работе, но работает), поэтому все, что мне нужно, это их имя пользователя и примерно полторы минуты.

import-module ActiveDirectory
$username = Read-Host -prompt 'Username'
$dn = Get-ADUSER $username -properties * | SELECT -expand DistinguishedName
$results = Get-ADCOMPUTER -LDAPFilter "(ManagedBy=$dn)" -properties * | SELECT CN,ManagedBy
$results | Out-Host
$cn = Read-Host -prompt 'Choose a computerName from above'


#Copy the .exe to remote system
$source = 'C:\Scripts\Programs\JavaSetup8u151.exe'
$destination = '\\' + $cn + '\C$\Users\' + $username + '\Downloads'
Copy-Item -Recurse -Filter *.* -path $source -destination $destination -Force

#move to psTools directory for remote Install, you will need this directory
#tied into your  dir "C:\\psTools" for example


cd \psTools
#Ensures that remoting is activated on end client

.\psexec \\$cn -s powershell Enable-PSRemoting -Force

#Remote to machine

INVOKE-COMMAND -ComputerName $cn -ScriptBlock {

#Passing in local variable, mainly for directory movement purposes
$username = $using:username

#define SearchVariable to see if already install
$searchTerm = 'Java'

#Setup for uninstall
$app = Get-WMIObject -Class Win32_Product -Filter "Name LIKE '%$searchTerm%'"
IF ($app -eq $null) {
    WRITE-HOST 'Currently no programs containing' $searchTerm 'in their name.'
} ELSE {
    $app.uninstall()
    $app = Get-WMIObject -Class Win32_Product -Filter "Name LIKE '%$searchTerm%'"
    IF ($app -eq $null) {
        WRITE-HOST 'Successfully deleted all programs containing' $searchTerm '.'
    } ELSE {
        WRITE-HOST 'Failed to delete all programs containing' $searchTerm '. Please report errors to ADMIN.'
    }
}

cd \Users\$username\Downloads

#This was just me proving to myself that I was in the right dir and the file was actually copying over
$dir = Get-ChildItem -Force
$dir | Out-Host

#Install
cmd
.\JavaSetup8u151.exe INSTALL_SILENT=1 AUTO_UPDATE=0 REBOOT=0 SPONSORS=0 REMOVEOUTOFDATEJRES=1
Start-Sleep -s 60


#Reset variable so we can see if install was successful or not
$app = Get-WMIObject -Class Win32_Product -Filter "Name LIKE '%$searchTerm%'"
IF ($app -ne $null) {
    WRITE-HOST 'You have successfully installed' $searchTerm'.'
} else {
    WRITE-HOST 'You have failed to install' $searchTerm'.'
}
}

Извините, это плохой копипаст кода. Моя проблема заключалась в том, что exe не запускался; и я думаю, что он пытался запустить проверку IF ELSE в конце до завершения установки. Командлет Start-Sleep был моим ответом. Я запустил его через cmd вместо ps, но я думаю, что теперь он будет работать в обоих направлениях. «РЕДАКТИРОВАТЬ: работает в обоих направлениях».

cmd 
.\JavaSetup8u151.exe INSTALL_SILENT=1 AUTO_UPDATE=0 REBOOT=0 SPONSORS=0 REMOVEOUTOFDATEJRES=1
 Start-Sleep -s 60

Я бы рекомендовал использовать:

Enter-PSSession -ComputerName $cn

Время, необходимое для установки. 45 секунд было просто стеснительным, поэтому я выбрал полные 60.

person Mark Vickery    schedule 11.12.2017