我很难让这个简单的(?)功能在今天工作。
我有一个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)的备用凭据来启动脚本?我也热衷于保留我的目录结构,其中包括带空格的文件夹。该脚本的标题为:“服务器运行状况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来实现,只需要获得正确的格式化?我可能在启动过程或调用命令的试验中错过了一个/或“或”某个地方。
任何帮助表示赞赏!
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参数无效。我确信有办法做到这一点。
答案 0 :(得分: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
的{{1}}参数传递所有参数作为数组传递给Start-Process
,这意味着参数必须是-ArgumentList
- 分开。
,
和-file
等文字字符串元素必须引用 添加-List
以等待脚本完成;默认情况下,-Wait
异步(名为Start-Process
的所有PS cmdlet都是)。
Start-*
错误消息;实际上,Access denied
被忽略。仅当不以其他用户身份运行时:如果要在当前控制台窗口中运行脚本,请添加-Wait
; -NoNewWindow -Wait
默认为Start-Process
和powershell.exe
等控制台应用程序打开一个新窗口。
cmd.exe
。至于原始症状和为什么使用-NoNewWindow
在本地运行命令,因为不同的用户是不明智的:
Invoke-Command
要求同时指定Invoke-Command -Credential ...
参数。
-ComputerName
以查看涉及Get-Help Invoke-Command
参数的所有参数集。 OP的原始命令只有-Credential
,但不是-Credential
,这导致PS抱怨没有明确标识参数集。使用-ComputerName
后,即使您指定-ComputerName
- 本地计算机 - ,也始终使用PowerShell 远程处理唯一的目标计算机。
简而言之:
虽然可以使用.
执行纯粹的本地调用,但您不能像其他用户那样执行,因为这总是涉及远程处理。
Invoke-Command
仅用于在本地运行命令 ,可选择作为其他用户。