Підвищення UAC через .bat файл?


10

Досить прямо, на що у мене виникають проблеми з пошуком відповіді.

Раніше сервер за замовчуванням допомагав мені знайти спосіб автоматичного оновлення Windows без використання WSUS. Це працює фантастично, але для запуску через мережу потрібно спочатку встановити спільний диск. Це досить простий XP, оскільки ви просто встановите накопичувач і запустіть оновлення.

Однак для Vista та W7 все це потрібно робити з підвищеними привілеями, щоб правильно працювати. Обліковий запис UAC не може бачити мережеві накопичувачі, змонтовані звичайним користувачем, тому для того, щоб все працювало, я повинен змонтувати папку через net useескалацію оболонки. Я хотів би автоматизувати монтажу цієї спільної частини та запустити оновлення за допомогою простого файлу .bat.

Я, мабуть, можу просто доручити всім правою кнопкою миші клацнути «Запустити як адміністратор» у файлі .bat, але я хотів би зробити все максимально простим та мати .bat автоматично запропонувати користувачу ескалацію своїх привілеїв.

Оскільки ці комп’ютери не належать нам, я не можу розраховувати на те, що інсталюється Powershell, так що правила будь-якого рішення у цих напрямках виходять і в значній мірі повинні покладатися на речі, які будуть включені в установку RTM Vista. Я сподіваюся, що в основному тут я пропускаю щось очевидне. :)

Відповіді:


8

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

РЕДАКТУВАННЯ: Якщо ви даєте клієнтові один файл для запуску, чому б не створити самостійно витягує RAR за допомогою WinRAR і встановити прапорець «Потрібний адміністратор» у параметрах SFX? Це позбавить вас обмеження лише 1 файлу, ви можете мати всі необхідні ресурси.

Крім того, зробіть свій SFX за допомогою улюбленого інструмента SFX та використовуйте інструменти для підняття, наведені вище.


Я маю це на увазі, але, знову ж таки, намагаюся уникати нічого додаткового, оскільки ці машини належать третім сторонам.
jslaker

Я вважаю, що ви можете використовувати їх, не встановлюючи їх, просто упакуйте їх поруч із вашим пакетним файлом.
ta.speot.is

Є кілька файлів в завантаженнях, але це виглядає як все , що вам було б потрібно для вашого вимоги було б elevate.cmdіelevate.vbs
НЕ Припинено до подальшого повідомлення.

Якщо я можу упакувати це все щось досить автономне / портативне, це може спрацювати. Я детальніше ознайомлюсь із цим, коли сьогодні у мене буде трохи більше часу.
jslaker

Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Марк Хендерсон

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

@jslaker: це, безумовно, може бути проблемою з Vista / 2008. Але PSH включений у програму Win7 / 2008R2, щоб це стало простіше. Чи може це бути корпоративною ситуацією в корпоративній ситуації?
Річард

Ну, це не корпоративна ситуація. В оригінальному питанні, з яким я пов’язаний, є більше, але коротка версія полягає в тому, що ми ремонтуємо ПК, і це, в основному, все, що намагається вирішити, що ліцензія WSUS забороняє вам використовувати WSUS для розгортання оновлень на машинах, які не є ліцензію вашої організації. Це всі машини для клієнтів, які можуть працювати з XP RTM. Ось чому я не можу реально розраховувати на те, що буде встановлено, що не входило б у встановлення RTM будь-якої ОС.
jslaker

Якщо ви не можете розраховувати на встановлення Powershell, перегляньте відповідь, яку я дав нижче.
Метт

3

ось приклад сценарію, який я придумав, сподіваюся, він допомагає іншим. Це bat-файл, який запитує користувача на отримання дозволу, а потім збільшується. Він передає деякий vbscript, який запускає запит UAC, а потім повторно запускає піднятий файл bat ... http://jagaroth.livejournal.com/63875.html


2

Це те, що вам потрібно: http://sites.google.com/site/eneerge/home/BatchGotAdmin


1
Цей скрипт має незначну помилку, він не пересилає жодних параметрів. Просто введіть їх у команду для виклику вашого сценарію так: echo UAC.ShellExecute "% ~ s0", "% *", "", "runas", 1 >> "% temp% \ getadmin.vbs"
SvenS

1

FusionInventory.org - це рішення з відкритим кодом, яке в основному використовується невеликими ремонтними майстернями. Це може бути як ваш особистий віддалено керований оновник Windows.


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 за допомогою пакетного файлу

Для цього не потрібно нічого встановлювати та закінчувати. Якщо вам потрібно зберегти аргументи командного рядка, розгляньте це оновлення.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.