Batch-File
通過 .bat 文件提升 UAC?
非常簡單的一個,我很難找到答案。
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 }