如果您准备转换为PowerShell,则此操作会容易得多。这是我的“ Elevate-Process.ps1
”脚本(su
在我的个人资料中使用别名):
# Updated elevate function that does not need Elevate PowerToys
# From http://devhawk.net/2008/11/08/My+ElevateProcess+Script.aspx
$psi = new-object System.Diagnostics.ProcessStartInfo
$psi.Verb = "runas"
# If passed multiple commands, or one (that isn't a folder) then execute that command:
if (($args.Length -gt 1) -or (($args.length -eq 1) -and -not (test-path $args[0] -pathType Container))) {
$file, [string]$arguments = $args;
$psi.FileName = $file
$psi.Arguments = $arguments
[System.Diagnostics.Process]::Start($psi) | out-null
return
}
# If from console host, handle case of one argyment that is
# a folder, to start in that folder. Otherwise start in current folder.
if ($host.Name -eq 'ConsoleHost') {
$psi.FileName = (Get-Command -name "PowerShell").Definition
if ($args.length -eq 0) {
$psi.Arguments = "-NoExit -Command &{set-location '" + (get-location).Path + "'}"
} else {
$psi.Arguments = "-NoExit -Command &{set-location '" + (resolve-path $args[0]) + "'}"
}
[System.Diagnostics.Process]::Start($psi) | out-null
return
}
# Otherwise this is some other host (which cannot be assumed to take parameters).
# So simplely launch elevated.
$psi.FileName = [system.diagnostics.process]::getcurrentprocess().path
$psi.Arguments = ""
[System.Diagnostics.Process]::Start($psi) | out-null
也可以在PSH中检测到升高的情况(因此您可以检查升高的位置,然后在需要时升高):
$wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$prp=new-object System.Security.Principal.WindowsPrincipal($wid)
$adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
$IsAdmin=$prp.IsInRole($adm)
if ($IsAdmin) {
$host.UI.RawUI.Foregroundcolor="Red"
write-host "`n** Elevated Session **`n" -foreground $_errorColour -background $_errorBackound
}