【发布时间】:2014-01-03 14:13:11
【问题描述】:
在尝试以提升的权限运行进程时,我遇到了非常奇怪的错误。我编写了一个获取命令和用户凭据的 PS 函数,它应该在这些凭据下执行命令。它类似于 Start-Process cmdlet,但我编写了该函数,因为我需要捕获已执行命令的输出。关键是当我将ProcessStartInfo 的属性Verb 设置为应该启动UAC 的“runas”时。
我的功能在这里:
Function Grant-ElevatedPrivileges {
[cmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[String]$command
,
[Parameter(Mandatory=$true)]
[System.Management.Automation.PSCredential]$credential
)
Write-Verbose -msg "EXECUTING COMMAND WITH ELEVATED PRIVILEGES: $command"
# Write-Host "$command"
$result = @{'result' = $false; 'output' = $false; 'error' = $false};
$psi = New-object System.Diagnostics.ProcessStartInfo
#$psi.CreateNoWindow = $true
$psi.UseShellExecute = $false
$psi.RedirectStandardOutput = $true
$psi.RedirectStandardError = $true
$psi.FileName = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
$psi.Arguments = @"
-ExecutionPolicy Bypass -noprofile $command
"@
$psi.UserName = $credential.GetNetworkCredential().UserName
if ($credential.GetNetworkCredential().Domain -ne "") { $psi.Domain = $credential.GetNetworkCredential().Domain }
$psi.Password = $credential.Password
$psi.Verb = "runas"
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $psi
try {
$result['result'] = $process.Start()
$process.WaitForExit()
$result['output'] = $process.StandardOutput.ReadToEnd()
$result['error'] = $process.StandardError.ReadToEnd()
} catch [System.ComponentModel.Win32Exception] {
if (($_.Exeption.NativeErrorCode) -eq 1326) {
Write-Verbose "USUARIO O CONTRASEÑA INCORRECTA"
$result['error'] = "BADUSER"
} else {
$result['error'] = $_.Exception.Message
}
$result['result'] = $false
} catch {
$result['result'] = $false
$result['error'] = Write-Error $_.Exception.Message
}
if ($result['error'] -ne '') {
Write-Verbose $result['error']
$result['result'] = $false
}
$result
}
我通过调用函数来检查我提到的行为:
Grant-ElevatedPrivileges -command "([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')" -credential $creds -Verbose
如果在管理员权限下执行的命令应该返回 True...
关于我缺少什么的任何想法?
感谢您的建议或想法;)
【问题讨论】:
-
对于它的价值,我测试了你的代码,并且能够发现它没有从非提升提示中请求提升。你从这里得到你的代码想法吗? codeproject.com/Articles/105506/…
-
你的问题是什么?它不返回true吗?它是否返回错误?
-
@TrevorSullivan,我写了大约 3 个月的函数,所以我不记得确切的来源,但可能是我的来源之一。尽管如此,据我记得 MSDN 上的文档,如果我将动词设置为“runas”,它应该会提升 UAC 窗口,不是吗?
-
@LarsTruijens,我的问题是,如果我用我提到的代码测试我的函数,它总是返回 false,当它应该返回 true 时,因为它应该在管理员上下文中执行。
-
@SantiFdezMunoz MSDN 文档没有明确指出“runas”动词。它指出
Verb属性应匹配只读Verbs属性输出的值之一。查看Verbs的文档,它说返回的值是基于为FileName属性指定的值的扩展。 msdn.microsoft.com/en-us/library/…
标签: powershell uac