运行Powershell脚本,使用-list(参数)替代凭证
我很努力使今天能够使用这个简单的(?)函数。运行Powershell脚本,使用-list(参数)替代凭证
我有一个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""}
因此,概括地说,如何让一个脚本与读取命令行参数( - 列出)备用凭据启动?我也热衷于保存我的目录结构,其中包括带空格的文件夹。该脚本的标题是:“服务器健康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参数无效。我确信有一种方法可以做到这一点。
注意:需求变得更清晰后完全重写。
要运行命令为不同的用户本地,使用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
- 注意如何阵列在表达模式,这意味着,文字串的元素如
-
添加
-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
查看涉及参数-Credential
的所有参数集。 OP的原始命令只有-Credential
,但不是-ComputerName
,这导致PS抱怨没有参数集可以明确标识。
- 运行
-
一旦你使用
-ComputerName
,PowerShell的远程不变地使用,即使您指定.
- 在本地计算机 - 作为唯一计算机的目标。- 使用远程有两层含义:
- Remoting是不是默认情况下可用,并且必须在目标计算机上配置(本地计算机,在这种情况下)。
- 使用远程处理需要调用admin权限。
- 使用远程有两层含义:
简而言之:
虽然你可以与
Invoke-Command
进行纯粹的本地调用,你不能这样做作为另一个用户,因为这不可避免地涉及远程处理。Start-Process
,相比之下,单独存在来运行命令局部,任选地作为一个不同的用户。