如何在PowerShell中使用用户凭据运行Start-Process?

6

我有一个运行在Windows服务(Jenkins)上的脚本,需要以特定用户身份运行一个命令。

我尝试过这样做,但是不起作用:

$secpasswd = ConvertTo-SecureString "myPassword" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential("DOMAIN\myUsername", $secpasswd)

$Arguments = @()
$Arguments += "-Command"
$Arguments += "pwd"
$Arguments += ">"
$Arguments += "output.txt"
Start-Process powershell.exe -ArgumentList $Arguments -Credential $mycreds -NoNewWindow -WorkingDirectory $workingDir
Start-Sleep 2
Get-Content "$workingDir\output.txt"

我得到了以下输出:
Start-Process : This command cannot be executed due to the error: Access is denied.
At C:\Windows\TEMP\hudson2382859596554223918.ps1:32 char:14
+ Start-Process <<<<  powershell.exe -ArgumentList $Arguments -Credential $mycreds -NoNewWindow -WorkingDirectory $workingDir
    + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

现在如果我删除-Credential $mycreds,它可以正常工作。在末尾加上Start-Sleep的原因是我删除了在这个SO问题中的-Wait选项。

我有什么遗漏吗?


你的密码中是否有任何需要转义的保留字符? - TheMadTechnician
你能否通过右键单击PowerShell并点击“以其他用户身份运行”来使用替代凭据在该计算机上启动PowerShell? - user189198
没有远程登录,一切都是本地的,但我必须这样做,因为Jenkins安装为Windows服务,并且它以SYSTEM用户身份启动powershell(从Write-Host“User:$([Environment] ::UserName)”的结果中可以看出),而当我尝试在本地运行时,它可以工作,因为相同的命令返回我的用户名。构建脚本需要访问本地网络上的一个脚本文件,该文件的权限设置允许我的帐户访问它。 - Uflex
4
Jenkins服务是由哪个用户运行的? 您需要特定的权限才能以不同的用户身份运行进程。 - Poorkenny
它似乎是在“SYSTEM”用户下运行。当您使用官方网站提供的安装程序在Windows 7上安装Jenkins时,这是默认设置。 - Uflex
显示剩余3条评论
2个回答

15
$username = "username"

$password = "password"


$credentials = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))


Start-Process dnscrypt-proxy.exe -WorkingDirectory path_here -Credential ($credentials)

--来自PowerShell论坛;我几天前也搜索了同样的解决方案,这个方法有效。希望对你有所帮助。

来源:http://powershell.com/cs/forums/t/9502.aspx


1
刚试了一下,我得到了之前遇到的同样错误:它在本地可以运行(如果我从开始菜单中运行 PowerShell),但是一旦我将脚本复制到 Jenkins 中,它就不再工作了... - Uflex
请注意,为了使其正常工作,用户名可能必须以DOMAIN\USERNAME的格式编写 - 否则我会不断收到无效凭据错误。 - alelom

7

终于找到了解决方案:默认情况下,Jenkins作为“本地系统帐户”运行服务日志。 要更改此设置,请启动服务应用程序(在开始菜单中键入“服务”),查找Jenkins,双击它并转到“登录”选项卡。

现在您应该看到服务正在使用的帐户。 更改为“此帐户”,填写您的帐户详细信息即可!

记录一下,我最初尝试运行的命令现在可以正常工作,无需添加任何“更改用户”之类的内容。

特别感谢@Poorkenny通过他的评论让我找到了正确的方向,谢谢! Stackoverflow棒极了!(当你因为某个人的帮助解决了一整天的问题时,那一刻真是太棒了...)


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