提问人:Kenny 提问时间:4/27/2016 最后编辑:Kenny 更新时间:2/12/2017 访问量:1094
运行使用 -List(参数)的 Powershell 脚本,该脚本具有备用凭据
Run Powershell script that uses -List (parameter) with alternate credentials that
问:
我今天一直在努力让这个简单的 (?) 函数工作。
我有一个 PowerShell 脚本,可以从基于 txt 的文件中读取计算机名称。当通过以下单行从 PowerShell 会话运行时,它工作正常:
./"Server Health Check.ps1" -List One-off.txt
正如你所看到的,它有一个很长的文件名,所以它被引号括起来。
但是,我正在构建一个带有单选框的 PowerShell GUI 表单,该单选框将传递用于调用脚本的文本文件的选择。诀窍是,该脚本需要使用备用管理员帐户运行,我不清楚如何使其工作。
对于我拥有的另一个不使用的脚本,我知道我可以使用以下内容,这使用旧的 DOS“runas”,但是,它不适用于 -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.
我几乎可以肯定这是可以通过invoke-command或start-process实现的,这只是获得正确格式的问题吗?我可能在使用 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
使这项工作的关键是通过 的参数将所有要传递的参数作为数组传递给,这意味着参数必须分隔。
powershell.exe
Start-Process
-ArgumentList
,
- 请注意,数组始终在表达式模式下被解析,这意味着文本字符串元素(如 和 )必须加引号。
-file
-List
- 通常,了解 PowerShell 的两种基本分析模式(参数模式和表达式模式)之间的区别非常重要,以及在以下情况下应用哪种模式 - 请参阅 https://technet.microsoft.com/en-us/library/hh847892.aspx
- 请注意,数组始终在表达式模式下被解析,这意味着文本字符串元素(如 和 )必须加引号。
添加以等待脚本完成; 默认情况下是异步的(所有命名的 PS cmdlet 都是异步的)。
-Wait
Start-Process
Start-*
- 注意事项:对于以其他用户身份调用的命令,只能从提升的提示符等待。
如果不是,该命令仍将执行,但会异步执行,并且您将在当前控制台中收到错误消息;实际上,被忽略。Access denied
-Wait
- 注意事项:对于以其他用户身份调用的命令,只能从提升的提示符等待。
仅当不以其他用户身份运行时:如果要在当前控制台窗口中运行脚本,请添加; 默认情况下,为控制台应用程序(如 和 )打开一个新窗口。
-NoNewWindow -Wait
Start-Process
powershell.exe
cmd.exe
- 如果您确实以其他用户身份运行该命令,则会悄悄忽略。
-NoNewWindow
- 如果您确实以其他用户身份运行该命令,则会悄悄忽略。
至于原始症状以及为什么使用 Invoke-Command
以其他用户身份在本地运行命令是不明智的:
Invoke-Command -Credential ...
要求也指定参数。-ComputerName
- 运行以查看涉及该参数的所有参数集。OP 的原始命令只有 ,但没有 ,这导致 PS 抱怨说没有参数集可以明确地识别。
Get-Help Invoke-Command
-Credential
-Credential
-ComputerName
- 运行以查看涉及该参数的所有参数集。OP 的原始命令只有 ,但没有 ,这导致 PS 抱怨说没有参数集可以明确地识别。
使用后,将始终使用 PowerShell 远程处理,即使将本地计算机指定为唯一目标计算机也是如此。
-ComputerName
.
- 使用远程处理有两个含义:
- 默认情况下,远程处理不可用,必须在目标计算机(在本例中为本地计算机)上进行配置。
- 使用远程处理需要使用管理员权限进行调用。
- 使用远程处理有两个含义:
总之:
虽然您可以使用 执行纯本地调用,但不能以其他用户身份执行此操作,因为这总是涉及远程处理。
Invoke-Command
Start-Process
,相比之下,它仅用于在本地运行命令,可以选择以其他用户身份运行命令。
评论