【发布时间】:2019-07-24 14:15:50
【问题描述】:
我有一个必须以提升用户身份运行的脚本。我正在使用问题“Running a PowerShell script as administrator without typing in passwords”中的代码 但我的第二个脚本没有被调用。第一个脚本由系统进程触发(我的票务系统收到一封电子邮件,然后它以主题行作为参数调用我的提升脚本),并且不能简单地使用计划任务。
调用脚本:
param(
[Parameter(Mandatory=$true)]
[String]$MyParam
)
$LogFile = "c:\temp\log.txt"
$encpwd = Get-Content c:\temp\password.bin
$passwd = ConvertTo-SecureString $encpwd
$cred = new-object System.Management.Automation.PSCredential 'domain\LocalAdminAccount',$passwd
Add-Content $LogFile "I am running as $env:userdomain\$env:username"
Add-Content $LogFile "Trying to call the script with the parameter: $MyParam"
try {
Add-Content $LogFile "Calling script"
Start-Process PowerShell -WorkingDirectory 'C:\Windows\System32' -Cred $cred -ArgumentList '-File', "c:\temp\TargetScript.ps1 $MyParam"
Add-Content $LogFile "Script called"
} catch {
$msg = $Error[0].Exception.Message
Add-Content $LogFile "Error caught: $msg"
}
Add-Content $LogFile "Error caught: $msg"
被调用的脚本:
param(
[Parameter(Mandatory=$true)]
[String]$PassedParam
)
$LogFile = "c:\temp\log.txt"
Add-Content $LogFile "I am running as $env:userdomain\$env:username"
if ($PassedParam) {
try {
#stuff
if ($?) {
Add-Content $LogFile "$PassedParam worked"
} else {
Add-Content $LogFile "Failed"
}
} catch {
$msg = $Error[0].Exception.Message
Add-Content $LogFile "Error caught: $msg"
}
}
Add-Content $LogFile "Error caught: $msg"
这就是放在日志文件中的内容:
I am running as DOMAIN\COMPUTER$
Trying to call the script with the parameter: Tim
Calling script
它似乎从未真正启动第二个 powershell 进程,或者至少如果它启动了,第二个 powershell 进程没有写入日志文件。我特意授予 LocalAdminAccount 对日志文件和 password.bin 文件的完全权限,并且 LocalAdminAccount 在计算机的管理员组中。
如果重要的话,我的 powershell 版本是:
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
更新: 如果我以自己的身份登录计算机并运行脚本,日志文件显示如下:
I am running as DOMAIN\TIM
Trying to call the script with the parameter: Tim
Calling script
Script called
I am running as DOMAIN\LocalAdminAccount
Tim worked
Error caught:
更新: 我确实找到了这篇文章:https://www.pdq.com/blog/secure-password-with-powershell-encrypting-credentials-part-2/,这表明我需要为密码提供解密密钥,因为我在我的帐户下创建了密码文件,但它正在被 NT SYSTEM 解密。但这并没有解决我的问题。
我通过简单地尝试调用记事本进行了更多测试。如果我尝试以其他用户身份打开它会失败,但如果我只是尝试打开它,我可以在以 SYSTEM 用户名运行的任务管理器中看到它。
我的问题似乎真的是 SYSTEM (DOMAIN\COMPUTER$) 没有能力以其他用户身份运行进程?
【问题讨论】:
-
尝试从powershell执行
Start-Process PowerShell...行...当我测试它时,它没有被提升...(即使get-credential也没有) -
@T-Me 如果我运行这些行来获取 password.bin 并创建 $cred,然后运行 start-process 行,它可以工作。这是意料之中的,因为手动运行脚本也可以。只有当脚本以
DOMAIN\COMPUTER$运行时,才会调用第二个脚本。 -
事件查看器有什么用处吗?我认为任何涉及凭据的调用至少会出现在安全日志中。
-
我宁愿告诉你如何在系统帐户。关于这一点,请参见:Run PowerShell as SYSTEM(授人以鱼,你养他一天。教人钓鱼,你养他一辈子。)
-
如果您已经以
SYSTEM帐户运行,则不需要提升。
标签: powershell uac