4

我想通过 Jenkins Job 使用 powershell 部署代码。这在 powershell ise 中运行良好。

$username = "mydomain\builder"
$password = "notmypassword"
$credentials = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))
$Arguments = "-ExecutionPolicy Bypass -File C:\Test.ps1 -NoNewWindow -WorkingDirectory C:\Windows\System32\WindowsPowerShell\v1.0 -NoLogo -NonInteractive"

Start-Process "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Credential $credentials -ArgumentList $Arguments

但是当我从使用本地系统的 Jenkins 运行它时,我收到以下错误消息。

Start-Process : This command cannot be run due to the error: Access is denied.
At C:\WINDOWS\TEMP\hudson5557889306949142167.ps1:7 char:1
+ Start-Process powershell.exe -Credential $credentials -ArgumentList $

如果更改,我将 Jenkins 服务更改为另一个帐户,它可以工作。为什么提升的权限在本地系统帐户下不起作用?

注意:test.ps1 中唯一的代码是 New-Item c:\scripts\new_file.txt

4

1 回答 1

3

在LocalSystem下运行脚本时,似乎对某些命令有限制。鉴于LocalSystem,这在安全性方面是有意义的:

可以完全不受限制地访问本地资源。这也是 LocalSystem 的缺点,因为 LocalSystem 服务可以做一些会导致整个系统崩溃的事情。

参考:MSDN,LocalSystem 帐户

SuperUser 有一个类似的问题:无法从 LocalSystem 帐户创建具有提升权限的进程,目前没有答案,现在参考这个答案。

TechNet 上有一个类似的问题:以 LocalSystem 用户的权限运行 PowerShell 脚本,答案建议通过任务计划程序运行脚本。

我可以考虑使用runaswith/savecred和 a/user:...具有适当的权限,其密码永不过期。AFAIR 您必须以交互方式调用runas一次/savecred,输入凭据,它将从下一次调用开始获取保存的凭据。

于 2015-11-01T13:33:39.210 回答