运行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.execmd.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,相比之下,单独存在来运行命令局部,任选地作为一个不同的用户。