Podnoszenie UAC za pomocą pliku .bat?

10

Całkiem prosta, na którą nie mogę znaleźć odpowiedzi.

serverfault poprzednio pomógł mi znaleźć sposób na zautomatyzowanie aktualizacji Windows bez użycia WSUS. Działa fantastycznie, ale aby uruchomić go w sieci, musisz najpierw zamontować dysk udostępniony. To dość proste XP, ponieważ po prostu montujesz dysk i uruchamiasz aktualizator.

Jednak w systemach Vista i W7 wszystko to musi być wykonane z podwyższonymi uprawnieniami do poprawnego działania. Konto UAC nie widzi dysków sieciowych montowanych przez zwykłego użytkownika, więc aby wszystko działało, muszę zamontować udział net usez eskalowanej powłoki. Chciałbym zautomatyzować montowanie tego udziału i uruchamianie programu aktualizującego za pomocą prostego pliku .bat.

Prawdopodobnie mógłbym po prostu poinstruować wszystkich, aby kliknęli prawym przyciskiem myszy „Uruchom jako administrator” w pliku .bat, ale chciałbym, aby wszystko było tak proste, jak to możliwe, i pozwolić, aby .bat automatycznie monitował użytkownika o zwiększenie uprawnień.

Ponieważ te komputery nie należą do nas, nie mogę liczyć na zainstalowanie Powershell, więc rządzi to wszystkimi rozwiązaniami zgodnymi z tymi zasadami i w zasadzie muszą polegać na rzeczach, które byłyby zawarte w instalacji RTM Vista. Mam nadzieję, że przeoczyłem tutaj coś oczywistego. :)

jslaker
źródło

Odpowiedzi:

8

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

EDYCJA: Jeśli dajesz klientowi jeden plik do uruchomienia, dlaczego nie utworzyć samorozpakowującego się pliku RAR za pomocą WinRAR i ustawić flagę „Wymagaj administratora” w opcjach SFX? To zwalnia Cię z limitu tylko 1 pliku, możesz mieć wszystkie potrzebne zasoby.

Możesz też zrobić SFX za pomocą swojego ulubionego narzędzia SFX i użyć wyżej wymienionych narzędzi do podnoszenia.

ta.speot.is
źródło
Będę o tym pamiętać, ale znowu staram się unikać instalowania czegokolwiek dodatkowego, ponieważ te maszyny należą do stron trzecich.
jslaker
Wierzę, że możesz ich użyć bez ich instalowania, po prostu spakuj je obok pliku wsadowego.
ta.speot.is
Pobrano kilka plików, ale wygląda na to, że wszystko, czego potrzebujesz do spełnienia wymagań, elevate.cmdielevate.vbs
Wstrzymano do odwołania.
Jeśli mogę spakować to wszystko, co jest raczej samodzielne / przenośne, może to działać. Przyjrzę się temu bliżej, kiedy będę miał trochę więcej czasu później.
jslaker,
Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Mark Henderson
4

Jeśli jesteś przygotowany na konwersję do PowerShell, jest to o wiele łatwiejsze do zrobienia. To jest mój Elevate-Process.ps1skrypt „ ” (z sualiasem w moim profilu):

# 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

Wykrywanie podniesienia może być również wykonane w PSH (dzięki czemu można sprawdzić podniesienie, a następnie podwyższyć, jeśli to konieczne):

$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
}
Richard
źródło
Uznałem, że Powershell może to zrobić, ale znowu nie mogę polegać na zainstalowaniu Powershell i potrzebuję czegoś tak ognistego i zapomnieć, jak to możliwe.
jslaker,
@ jslaker: z pewnością może to stanowić problem w systemie Vista / 2008. Ale PSH jest dołączony do Win7 / 2008R2, więc powinno być łatwiej. Czy w sytuacji korporacyjnej może to być motywacja do wdrożenia?
Richard
Cóż, to nie jest sytuacja korporacyjna. W pierwotnym pytaniu, które połączyłem, jest więcej, ale krótka wersja jest taka, że ​​jesteśmy warsztatem naprawczym na komputery PC, i to w zasadzie wszystko stara się obejść, że licencja WSUS zabrania ci używania WSUS do wdrażania aktualizacji na komputerach, które nie są licencjonowane dla twojej organizacji. Są to wszystkie komputery klienckie, na których można uruchomić dowolną wersję od XP RTM. Dlatego tak naprawdę nie mogę polegać na czymkolwiek instalowanym, co nie byłoby zawarte w instalacji RTM żadnego systemu operacyjnego.
jslaker
Jeśli nie możesz polegać na zainstalowaniu PowerShell, sprawdź odpowiedź, którą podałem poniżej.
Matt
3

Oto przykładowy skrypt, który wymyśliłem, mam nadzieję, że pomoże innym. Jest to plik nietoperza, który monituje użytkownika o zgodę, a następnie sam się eskaluje. Odpowiada za vbscript, który wyzwala monit UAC, a następnie ponownie uruchamia podniesiony plik nietoperza ... http://jagaroth.livejournal.com/63875.html

Rzecz
źródło
2

Oto, czego potrzebujesz: http://sites.google.com/site/eneerge/home/BatchGotAdmin

Emilio
źródło
1
Ten skrypt ma niewielki błąd, nie przekazuje żadnych parametrów. Wystarczy umieścić je w poleceniu wywołania skryptu w następujący sposób: echo UAC.ShellExecute "% ~ s0", "% *", "", "runas", 1 >> "% temp% \ getadmin.vbs"
SvenS
1

FusionInventory.org to rozwiązanie typu open source, z którego najczęściej korzystają małe warsztaty naprawcze. Może to być twój osobisty, zdalnie sterowany aktualizator systemu Windows.

rjt
źródło
0

Żadne z tych rozwiązań nie działa w przypadku pliku .cmd, który musi znać parametry wiersza polecenia. Umieść to na samym początku pliku .cmd, a wszystkie twoje problemy zostaną rozwiązane. (To jest dla przyszłych osób przeglądających ten wątek [Przetestowałem to na Windows XP, 7 Vista i 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---------------------
Grintor
źródło
0

Jak powiedział @emilio, ten skrypt jest w porządku, ale nie przyjmuje żadnych argumentów. Tutaj zmodyfikowany skrypt jest zgodny z argumentami:

:: 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"
:--------------------------------------
TanisDLJ
źródło
0

Jeśli nie możesz polegać na zainstalowanym programie Powershell, możesz skorzystać z tego rozwiązania na StackOverflow:

auto-Elevate z UAC przy użyciu pliku wsadowego

Nie wymaga niczego do zainstalowania i kończy się po wyjęciu z pudełka. Jeśli chcesz zachować argumenty wiersza polecenia, rozważ aktualizację.

Matt
źródło
-1

Czy wypróbowałeś runaspolecenie?

Wstrzymano do odwołania.
źródło