通过.bat文件提升UAC?


10

很简单,我很难找到答案。

serverfault 以前帮助我找到了一种无需使用WSUS即可自动执行Windows更新的方法。它的运行非常出色,但是要通过网络运行它,您必须首先安装共享驱动器。这是非常简单的XP,因为您只需安装驱动器并运行更新程序。

但是,在Vista和W7上,必须使用提升的权限才能完成所有操作。UAC帐户看不到普通用户安装的网络驱动器,因此,为了使所有功能正常运行,我必须通过net use升级的外壳安装共享。我想自动安装此共享并通过一个简单的.bat文件启动更新程序。

我可能只是指示所有人右键单击.bat文件上的“以管理员身份运行”,但我想使事情尽可能简单,并让.bat自动提示用户升级特权。

由于这些计算机不属于我们,因此我不能指望安装Powershell之类的东西,因此,按照这些规则来规定任何解决方案的方法,几乎​​必须依靠RTM Vista安装中包含的内容。我希望我在这里最容易遗漏的东西。:)

Answers:


8

http://technet.microsoft.com/zh-cn/magazine/2007.06.utilityspotlight.aspx

编辑:如果要给客户运行一个文件,为什么不使用WinRAR创建自解压RAR并在SFX选项中设置“ Require Administrator”标志?这使您免除了仅1个文件的限制,您可以拥有所需的所有资源。

或者,使用您喜欢的SFX工具制作SFX,然后使用上面的提升工具。


我会牢记这一点,但是,由于这些机器属于第三方,因此我再次尝试避免安装任何额外的东西。
jslaker 2010年

我相信您可以在不安装它们的情况下使用它们,只需将它们打包在批处理文件旁边。
ta.speot。是

有在下载多个文件,但它看起来像所有你需要为你的要求是elevate.cmdelevate.vbs
暂停,直至另行通知。

如果我可以将所有这些东西打包成相当独立的/便携式的,那么它可能会起作用。今天晚些时候我会仔细研究一下。
jslaker 2010年

尽管从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
马克·亨德森

4

如果您准备转换为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
}

我认为Powershell可以做到这一点,但我不能再依赖于Powershell的安装,而需要尽可能避免火灾和遗忘。
jslaker 2010年

@jslaker:这肯定是Vista / 2008的问题。但是PSH包含在Win7 / 2008R2中,因此应该更容易些。在公司情况下,这会成为推广的动力吗?
理查德(Richard)2010年

好吧,这不是公司情况。我链接的原始问题还有很多,但简短的说法是我们是一家PC维修店,而这基本上都是想办法解决,因为WSUS许可证禁止您使用WSUS将更新部署到不是该计算机的计算机上授权给您的组织。这些都是可以从XP RTM开始运行的所有客户计算机。这就是为什么我不能真正依赖于任何给定OS的RTM安装中不会包含的任何安装内容的原因。
jslaker 2010年

如果您不能依靠安装的Powershell,请查看我在下面给出的答案。
马特

3

这是我想出的一个示例脚本,希望对其他人有所帮助。这是一个蝙蝠文件,提示用户进行许可,然后自行升级。它通过管道输出一些vbscript脚本,该脚本会触发UAC提示,然后重新运行提升的bat文件... http://jagaroth.livejournal.com/63875.html



1

FusionInventory.org是一个开放源代码解决方案,主要供小型维修店使用。就像您的个人远程控制Windows Updater。


0

这些解决方案均不适用于需要知道命令行参数的.cmd文件。将其放在.cmd文件的开头,所有问题都将得到解决。(这是供将来浏览此线程的人使用的[我已经在Windows XP,7 Vista和8上对此进行了测试; x86 + x64]):

@echo off
NET SESSION >nul 2>&1 && goto noUAC
title.
set n=%0 %*
set n=%n:"=" ^& Chr(34) ^& "%
echo Set objShell = CreateObject("Shell.Application")>"%tmp%\cmdUAC.vbs"
echo objShell.ShellExecute "cmd.exe", "/c start " ^& Chr(34) ^& "." ^& Chr(34) ^& " /d " ^& Chr(34) ^& "%CD%" ^& Chr(34) ^& " cmd /c %n%", "", "runas", ^1>>"%tmp%\cmdUAC.vbs"
echo Not Admin, Attempting to elevate...
cscript "%tmp%\cmdUAC.vbs" //Nologo
del "%tmp%\cmdUAC.vbs"
exit /b
:noUAC

::-----Normal Batch Starts Here---------------------

0

正如@emilio所说,该脚本可以,但不接受任何参数。这里修改后的脚本与参数兼容:

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo args = "" >> "%temp%\getadmin.vbs"
    echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
    echo args = args ^& strArg ^& " "  >> "%temp%\getadmin.vbs"
    echo Next >> "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", args, "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs" %*
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

0

如果您不能依赖于已安装的Powershell,则可以在StackOverflow上采用以下解决方案:

使用批处理文件与UAC自动提升

它不需要安装任何内容,并且可以立即使用。如果需要保留命令行参数,请考虑更新。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.