提供凭据时,Start-process引发错误-可能是一个漏洞。

20

您是否知道为什么会出现以下代码的响应中引发此错误?用户名和密码已被验证为正确。

$secPassword = ConvertTo-SecureString "Password" -AsPlaintext -Force 
$farmCredential = New-Object System.Management.Automation.PsCredential "SharePoint\SP_Farm",$secPassword

Start-Process $PSHOME\powershell.exe -Credential $FarmCredential -ArgumentList "-NoExit","-Command `"&{`$outvar1 = 4+4; `"write-output `"Hello:`"`$outvar1`"}`"" -Wait

错误;

Start-Process : This command cannot be executed due to the error: The directory name is invalid.
At C:\Users\Administrator.SHAREPOINT\AppData\Local\Temp\fb2956d7-87fc-4235-9f3c-742698cafe9f.ps1:8 char:14
+ Start-Process <<<<  $PSHOME\powershell.exe -Credential $FarmCredential -ArgumentList "-NoExit","-Command `"&{`$outvar1 = 4+4; `"write-output 
`"Hello:`"`$outvar1`"}`"" -Wait
    + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

然而,这很好地运作。

Start-Process $PSHOME\powershell.exe -ArgumentList "-NoExit","-Command `"&{`$outvar1 = 4+4; `"write-output `"Hello:`"`$outvar1`"}`"" -Wait

注意:这是在PowerGUI或ISE IDE中执行时发生的情况。 文件fb2956d7-87fc-4235-9f3c-742698cafe9f.ps1确实存在于路径位置,因此IDE出现了一些困难。但是,当直接在PowerShell命令提示符/ shell中运行时它确实可以工作。 我使用本地机器帐户登录,该帐户作为本地管理员运行,脚本将执行方向指向一个没有管理员权限的域帐户,并将以普通用户权限运行。

作为开发人员,IDE不应该被这种情况绊倒,所以这是一个bug吗?因为当我在PowerShell命令提示符窗口运行块时它可以正常工作。


使用我的域用户凭据进行测试,它可以正常工作! - CB.
请注意,此错误发生在使用Power GUI或ISE时。 - chris
在 ISE 上测试过,它可以正常工作。 - CB.
可能需要以本地帐户登录进行测试,然后将脚本指向您的域帐户。 - chris
已在 ISE 上进行测试,本地账户通过域用户凭据验证成功。它正常工作! - CB.
由于SharePoint\SP_Farm在运行IDE的计算机上不是本地管理员,因此当我将该帐户添加到计算机的本地管理员组中时,它就可以工作了。这可能是由于IDE调试器试图附加到未能以权限访问内部幕后功能的进程。可能是一个错误。 - chris
7个回答

19

我遇到了同样的错误。

这个函数在PowerShell ISE中运行正常,但在PowerGUI中无法工作。

Start-Process -FilePath "C:\WINDOWS\System32\cmd.exe" -Credential $credential -ArgumentList ("/c $sFileExecutable")

它与WorkingDirectory参数配合使用。

Start-Process -FilePath 'cmd.exe' -Credential $credential -ArgumentList ("/c $sFileExecutable") -WorkingDirectory 'C:\Windows\System32'

2
这不是ISE与控制台的问题。Start-Process似乎将工作目录默认为当前(或起始)目录。首先,更改目录为帐户具有访问权限的目录也将解决此问题。我所做的是指定所有用户配置文件目录。-WorkingDirectory $env:ALLUSERSPROFILE - Nathan Hartley
设置工作目录对我很有用。当我尝试从映射的驱动器运行脚本时,脚本会遇到奇怪的错误。只有当我从“\myRemoteHost\folder\”而不是“S:\folder”执行脚本时才能正常工作。 - Lucas Pottersky


5
我知道现在有些晚了,但是这篇帖子确实帮助了我(特别是@Dionysoos的建议),我希望我的回答能够帮助其他人。
我也遇到了同样的错误...
Start-Process : This command cannot be executed due to the error: The directory name is invalid.

当在无人值守模式下运行脚本时,会出现问题,而在ISE中却可以正常工作。
无人值守脚本使用用户特定的$env:TEMP作为工作目录,这意味着新进程无法访问它。在Start-Process命令中指定-WorkingDirectory $env:windir解决了这个问题。

5

这是一个奇怪的问题,但我重新创建了错误,并修复了它...

http://support.microsoft.com/kb/832434

基本上,修改Powershell_ISE(或PowerGUI!)的启动目录为系统范围内的值。

简而言之:修改启动 Powershell ISE 的快捷方式,将“开始于”字段更新为 %WINDIR%,而不是 %HOMEDRIVE%%HOMEDIR%。 我可以确认,在 Windows XP 上这个方法修复了我的 Powershell ISE。 - Ben
2
我不知道你使用的PowerShell版本(或者它是否重要),但是Start-Process命令有一个-WorkingDirectory参数。我发现如果你指定类似于-WorkingDirectory C:\这样的东西,它可以解决问题。我相信这是因为你拥有的凭据将能够在没有任何权限问题的情况下看到C:\驱动器。 - Phil

1

我知道可能有点晚了,但是你运行这个命令的时候当前目录是网络路径吗?我曾经遇到过这个问题,如果我从系统驱动器上运行相同的命令,它就可以工作。


1
这个评论因其长度和内容被标记为“低质量”。也许它应该是一个评论? - Bill Bell

0
在我的情况下,问题是Windows 10保存了一个新文件到我预期的不同路径。我试图将profile.ps1文件添加到C:\Users\Username\Documents\WindowsPowerShell,但实际上应该是C:\Users\Username\**OneDrive**\Documents\WindowsPowerShell。因此,请尝试按照以下步骤操作。
RUN:
Test-Path C:\Users\User\Documents\WindowsPowerShell\
IF FALSE
New-Item -Path C:\Users\User\Documents\WindowsPowerShell\ -ItemType Directory
THEN
New-Item -Path $profile.CurrentUserAllHosts -Type File
THEN
start $profile.CurrentUserAllHosts

-1

仍然存在将-WorkingDirectory设置为exe目录的问题... 发现将-WorkingDirectory设置为C:\ Windows \ System32并使用fq路径到exe可以解决问题。


你好,欢迎来到 Stack Overflow!也许你可以进一步完善你的答案,以便用户更好地理解你的观点。 - Ulysse BN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接