Запустите сценарий Powershell, который использует -List (параметр) с альтернативными учетными данными, которые

Я изо всех сил пытался заставить эту простую (?) Функцию работать сегодня.

У меня есть сценарий PowerShell, который считывает имена компьютеров из текстового файла. Он отлично работает при запуске из сеанса PowerShell с помощью следующего однострочного кода:

./"Server Health Check.ps1" -List One-off.txt

Как видите, у него длинное имя файла, поэтому оно заключено в кавычки.

Однако я создаю форму графического интерфейса PowerShell с переключателями, которые передают выбор текстового файла, который будет использоваться для вызова сценария. Хитрость в том, что скрипт нужно запускать с альтернативной учетной записью администратора, и я не понимаю, как это сделать.

Для другого сценария, который у меня есть, который не используется, я знаю, что могу использовать что-то вроде следующего, он использует старые «руны» DOS, однако он не работает с функцией -list.

invoke-command -scriptblock {runas.exe /user:domain\$Env:Username"admin" "powershell.exe -file \"\\Server\c$\LONG FOLDER\Server Health Check.PS1""}

Итак, в двух словах, как запустить сценарий с альтернативными учетными данными, который считывает параметр (-List) из командной строки? Я также стремлюсь сохранить свою структуру каталогов, которая включает папки с пробелами. Сценарий называется: "Проверка работоспособности сервера.ps1".

Последнее, что я пробовал, было следующим

$ScriptPath = "C:\SCRIPTS FOLDER\Server Health Check.ps1"
$ArgList = "-List C:\SCRIPTS FOLDER\One-off.txt"
Invoke-Command -filepath $ScriptPath -Credential DragonBallDomain\$Env:UserName"Admin"  -ArgumentList $ArgList

В результате появилось следующее сообщение:

Invoke-Command : Parameter set cannot be resolved using the specified named parameters.

Я почти уверен, что это можно сделать с помощью команды вызова или запуска процесса, это просто вопрос правильного форматирования? Я, вероятно, пропустил / или ' или "" где-то в моих испытаниях с запуском процесса или командой вызова.

Любая помощь приветствуется!

Обновление от 30 апреля:

Я пробовал еще немного, чтобы сделать эту работу, я близок, но все еще не совсем там.

$LongScriptPath = resolve-path Script.ps1
$LongFolderPath = \\UNC\PATH TO FOLDER\WITH LONG NAME\
 start-process -filepath powershell.exe -argumentlist " -file``"$($FilePath.path)`"" -cred DOMAIN\USERID -WorkingDirectory "$LongFolderPath"

Добавление -credential вызывает ошибку, указывающую, что параметр -file недействителен. Я уверен, что есть способ сделать это.


person Kenny    schedule 27.04.2016    source источник


Ответы (1)


Примечание. Полностью переписано после прояснения требований.

Чтобы запустить команду от имени другого пользователя локально, используйте Start-Process -Credential ...

Это то, что вы пытались в своем обновлении в принципе, но есть проблемы с тем, как вы передаете параметры; попробуйте это вместо этого:

$LongScriptPath = resolve-path Script.ps1
$LongFolderPath = '\\UNC\PATH TO FOLDER\WITH LONG NAME\'
start-process `
  powershell.exe `
  -ArgumentList '-file', $LongScriptPath, '-List', 'One-off.txt' `
  -Credential DOMAIN\USERID `
  -WorkingDirectory $LongFolderPath
  • Ключом к этой работе является передача всех параметров для передачи в powershell.exe в виде массива с помощью параметра -ArgumentList в Start-Process, что означает, что параметры должны быть разделены ,.

    • Note how an array is always parsed in expression mode, which means that literal string elements such as -file and -List must be quoted.
    • В целом важно понимать разницу между двумя основными режимами синтаксического анализа PowerShell, режимом аргументов и режимом выражений, а также то, какой из них применяется, когда — см. https://technet.microsoft.com/en-us/library/hh847892.aspx
  • Добавьте -Wait, чтобы дождаться завершения скрипта; Start-Process по умолчанию является асинхронным (все командлеты PS с именем Start-* являются таковыми).

    • Caveat: For commands invoked as a different user, you can only wait from an elevated prompt.
      If it isn't, the command will still execute, but will do so asynchronously, and you'll get an Access denied error message in the current console; in effect, -Wait is ignored.
  • Только если не работает от имени другого пользователя: добавьте -NoNewWindow -Wait, если хотите запустить скрипт в текущем окне консоли; Start-Process по умолчанию открывает новое окно для консольных приложений, таких как powershell.exe и cmd.exe.

    • If you do run the command as a different user, -NoNewWindow is quietly ignored.

Что касается исходного симптома и почему использование Invoke-Command для локального запуска команды в качестве другого пользователя не рекомендуется:

  • Invoke-Command -Credential ... требует, чтобы параметр -ComputerName также был указан.

    • Run Get-Help Invoke-Command to see all parameter sets that involve the -Credential parameter. The OP's original command had only -Credential, but not -ComputerName, which caused PS to complain that no parameter set could be unambiguously identified.
  • После того как вы используете -ComputerName, PowerShell remoting неизменно используется, даже если вы укажете . (локальный компьютер) в качестве единственного целевого компьютера.

    • Using remoting has two implications:
      • Remoting is not available by default, and must be configured on the target computer (the local computer, in this case).
      • Для использования удаленного взаимодействия требуется вызов с правами admin.

Вкратце:

  • Хотя вы можете выполнять чисто локальные вызовы с помощью Invoke-Command, вы не можете делать это от имени другого пользователя, потому что это неизбежно требует удаленного взаимодействия.

  • Start-Process, напротив, существует исключительно для запуска команд локально, возможно, от имени другого пользователя.

person mklement0    schedule 27.04.2016