运行 使用 -List(参数)和备用凭据的 Powershell 脚本
Run Powershell script that uses -List (parameter) with alternate credentials that
今天我一直在努力让这个简单的(?)功能正常工作。
我有一个从 txt-based 文件中读取计算机名称的 PowerShell 脚本。当通过以下 one-liner:
从 PowerShell session 运行 时,它工作正常
./"Server Health Check.ps1" -List One-off.txt
如您所见,文件名很长,因此用引号引起来。
但是,我正在构建一个带有单选框的 PowerShell GUI 表单,该单选框将传递用于调用脚本的文本文件的选择。诀窍是,脚本需要 运行 和 备用 管理员帐户,我不清楚如何让它工作。
对于我得到的另一个不使用的脚本,我知道我可以使用以下内容,它使用旧的 DOS "runas",但是,它不适用于-列表功能。
invoke-command -scriptblock {runas.exe /user:domain$Env:Username"admin" "powershell.exe -file \"\Server\c$\LONG FOLDER\Server Health Check.PS1""}
那么,简而言之,如何使用从命令行读取参数 (-List) 的备用凭据启动脚本?我也热衷于保留我的目录结构,其中包括带空格的文件夹。脚本标题为:"Server health check.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.
我几乎可以肯定这是 invoke-command 或 start-process 的 do-able,只是格式正确的问题?我可能在 start-process 或 invoke-command.
的试验中某处遗漏了 / 或 ' 或 ""
感谢任何帮助!
4 月 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 参数无效。我确定有办法做到这一点。
注:需求明确后完全重写
以运行命令作为不同的用户在本地,使用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
完成这项工作的关键是通过 Start-Process
将所有参数作为 array 传递给 powershell.exe
-ArgumentList
参数,表示参数必须,
-分隔。
- 注意数组总是在表达式模式下解析,这意味着
-file
和-List
等文字字符串元素必须是引用.
- 了解 PowerShell 的两种基本解析模式 参数模式 和 表达式模式 之间的区别通常很重要适用于 - 参见 https://technet.microsoft.com/en-us/library/hh847892.aspx
添加-Wait
等待脚本完成; Start-Process
默认是 异步 (所有 PS cmdlet 命名为 Start-*
都是)。
- 警告:对于以不同用户身份调用的命令,您只能在 提升的 提示符下等待。
如果不是,该命令仍会执行,但会异步执行,并且您会在当前控制台中收到 Access denied
错误消息;实际上,-Wait
被忽略了。
仅当 不是 运行宁作为不同的用户时:添加 -NoNewWindow -Wait
如果你想 运行 当前控制台window中的脚本; Start-Process
默认为 powershell.exe
和 cmd.exe
.
等控制台应用程序打开一个新的 window
- 如果您以不同的用户执行 运行 命令,
-NoNewWindow
将被忽略。
至于最初的症状和为什么不建议在本地使用Invoke-Command
到运行命令作为不同的用户:
Invoke-Command -Credential ...
要求也指定 -ComputerName
参数。
- 运行
Get-Help Invoke-Command
查看所有涉及 -Credential
参数的参数集。 OP 的原始命令只有 -Credential
,但没有 -ComputerName
,这导致 PS 抱怨无法明确识别任何参数集。
一旦您使用 -ComputerName
,PowerShell remoting 总是被使用,即使您指定 .
- local 计算机 - 作为唯一的目标计算机。
- 使用远程处理有两个含义:
- 远程处理默认不可用,必须在目标计算机(在本例中为本地计算机)上配置。
- 使用远程处理需要使用 admin 权限进行调用。
简而言之:
虽然您可以使用Invoke-Command
执行纯本地调用,但您不能作为另一个用户 ],因为这总是涉及远程处理。
Start-Process
,相比之下,只存在于 运行 命令 locally,可选择作为不同的用户。
今天我一直在努力让这个简单的(?)功能正常工作。
我有一个从 txt-based 文件中读取计算机名称的 PowerShell 脚本。当通过以下 one-liner:
从 PowerShell session 运行 时,它工作正常./"Server Health Check.ps1" -List One-off.txt
如您所见,文件名很长,因此用引号引起来。
但是,我正在构建一个带有单选框的 PowerShell GUI 表单,该单选框将传递用于调用脚本的文本文件的选择。诀窍是,脚本需要 运行 和 备用 管理员帐户,我不清楚如何让它工作。
对于我得到的另一个不使用的脚本,我知道我可以使用以下内容,它使用旧的 DOS "runas",但是,它不适用于-列表功能。
invoke-command -scriptblock {runas.exe /user:domain$Env:Username"admin" "powershell.exe -file \"\Server\c$\LONG FOLDER\Server Health Check.PS1""}
那么,简而言之,如何使用从命令行读取参数 (-List) 的备用凭据启动脚本?我也热衷于保留我的目录结构,其中包括带空格的文件夹。脚本标题为:"Server health check.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.
我几乎可以肯定这是 invoke-command 或 start-process 的 do-able,只是格式正确的问题?我可能在 start-process 或 invoke-command.
的试验中某处遗漏了 / 或 ' 或 ""感谢任何帮助!
4 月 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 参数无效。我确定有办法做到这一点。
注:需求明确后完全重写
以运行命令作为不同的用户在本地,使用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
完成这项工作的关键是通过
Start-Process
将所有参数作为 array 传递给powershell.exe
-ArgumentList
参数,表示参数必须,
-分隔。- 注意数组总是在表达式模式下解析,这意味着
-file
和-List
等文字字符串元素必须是引用. - 了解 PowerShell 的两种基本解析模式 参数模式 和 表达式模式 之间的区别通常很重要适用于 - 参见 https://technet.microsoft.com/en-us/library/hh847892.aspx
- 注意数组总是在表达式模式下解析,这意味着
添加
-Wait
等待脚本完成;Start-Process
默认是 异步 (所有 PS cmdlet 命名为Start-*
都是)。- 警告:对于以不同用户身份调用的命令,您只能在 提升的 提示符下等待。
如果不是,该命令仍会执行,但会异步执行,并且您会在当前控制台中收到Access denied
错误消息;实际上,-Wait
被忽略了。
- 警告:对于以不同用户身份调用的命令,您只能在 提升的 提示符下等待。
仅当 不是 运行宁作为不同的用户时:添加
等控制台应用程序打开一个新的 window-NoNewWindow -Wait
如果你想 运行 当前控制台window中的脚本;Start-Process
默认为powershell.exe
和cmd.exe
.- 如果您以不同的用户执行 运行 命令,
-NoNewWindow
将被忽略。
- 如果您以不同的用户执行 运行 命令,
至于最初的症状和为什么不建议在本地使用Invoke-Command
到运行命令作为不同的用户:
Invoke-Command -Credential ...
要求也指定-ComputerName
参数。- 运行
Get-Help Invoke-Command
查看所有涉及-Credential
参数的参数集。 OP 的原始命令只有-Credential
,但没有-ComputerName
,这导致 PS 抱怨无法明确识别任何参数集。
- 运行
一旦您使用
-ComputerName
,PowerShell remoting 总是被使用,即使您指定.
- local 计算机 - 作为唯一的目标计算机。- 使用远程处理有两个含义:
- 远程处理默认不可用,必须在目标计算机(在本例中为本地计算机)上配置。
- 使用远程处理需要使用 admin 权限进行调用。
- 使用远程处理有两个含义:
简而言之:
虽然您可以使用
Invoke-Command
执行纯本地调用,但您不能作为另一个用户 ],因为这总是涉及远程处理。Start-Process
,相比之下,只存在于 运行 命令 locally,可选择作为不同的用户。