Batch-File

通過 .bat 文件提升 UAC?

  • May 4, 2015

非常簡單的一個,我很難找到答案。

serverfault以前幫助我找到了一種無需使用 WSUS 即可自動執行 Windows 更新的方法。它工作得非常好,但要通過網路執行它,你必須先安裝一個共享驅動器。這是非常簡單的 XP,因為您只需安裝驅動器並執行更新程序。

但是,在 Vista 和 W7 上,這一切都必須使用提升的權限才能正常工作。UAC 帳戶看不到普通使用者掛載的網路驅動器,因此為了讓一切正常執行,我必須通過net use升級的 shell 掛載共享。我想通過一個簡單的 .bat 文件自動安裝此共享並啟動更新程序。

我可能只是指示每個人在 .bat 文件上右鍵點擊“以管理員身份執行”,但我希望讓事情盡可能簡單,並讓 .bat 自動提示使用者提升他們的權限。

由於這些電腦不屬於我們,我不能指望安裝 Powershell 之類的任何東西,因此任何解決方案都遵循這些規則,並且幾乎必須依賴 RTM Vista 安裝中包含的東西。我希望我在這裡主要遺漏了一些明顯的東西。:)

http://technet.microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx

編輯:如果您給客戶一個執行的文件,為什麼不使用 WinRAR 創建一個自解壓 RAR 並在 SFX 選項中設置“需要管理員”標誌?這免除了您只有 1 個文件的限制,您可以擁有所需的所有資源。

或者使用您最喜歡的 SFX 工具製作您的 SFX,並使用上面的提升工具。

如果您準備轉換為 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
}

引用自:https://serverfault.com/questions/100423