Meninggikan UAC melalui file .bat?

10

Cukup mudah yang saya mengalami kesulitan menemukan jawaban.

serverfault sebelumnya membantu saya menemukan cara untuk mengotomatiskan pembaruan Windows tanpa menggunakan WSUS. Ini berfungsi luar biasa, tetapi untuk menjalankannya melalui jaringan, Anda harus memasang drive bersama terlebih dahulu. Itu XP yang cukup sederhana karena Anda baru saja memasang drive dan menjalankan updater.

Pada Vista dan W7, semua ini harus dilakukan dengan hak yang lebih tinggi untuk bekerja dengan benar. Akun UAC tidak dapat melihat drive jaringan dipasang oleh pengguna biasa, jadi untuk membuat semuanya berfungsi, saya harus memasang saham melalui net usedari eskalasi shell. Saya ingin mengotomatiskan pemasangan bagian ini dan meluncurkan pembaru melalui file .bat yang sederhana.

Saya mungkin bisa hanya menginstruksikan semua orang untuk mengklik kanan "Run as Administrator" pada file .bat, tetapi saya ingin menjaga hal-hal sesederhana mungkin dan memiliki .bat secara otomatis meminta pengguna untuk meningkatkan hak istimewa mereka.

Karena komputer ini bukan milik kami, saya tidak dapat mengandalkan apa pun seperti Powershell yang diinstal, sehingga aturan solusi apa pun di sepanjang garis keluar dan cukup banyak harus bergantung pada hal-hal yang akan dimasukkan dalam instalasi RTM Vista. Saya berharap saya sebagian besar kehilangan sesuatu yang jelas di sini. :)

jslaker
sumber

Jawaban:

8

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

EDIT: Jika Anda memberi pelanggan satu file untuk dijalankan, mengapa tidak membuat RAR yang mengekstraksi sendiri dengan WinRAR dan mengatur tanda "Memerlukan Administrator" di opsi SFX? Ini membebaskan Anda dari batas Anda hanya 1 file, Anda dapat memiliki semua sumber daya yang Anda butuhkan.

Atau buat SFX Anda menggunakan alat SFX favorit Anda dan gunakan alat meninggikan di atas.

ta.speot.is
sumber
Saya akan mengingat hal ini, tetapi, sekali lagi, saya mencoba menghindari menginstal sesuatu yang ekstra karena mesin ini milik pihak ketiga.
jslaker
Saya percaya Anda dapat menggunakannya tanpa menginstalnya, cukup bungkus di samping file batch Anda.
ta.speot.is
Ada beberapa file dalam unduhan, tetapi sepertinya semua yang Anda perlukan untuk kebutuhan Anda adalah elevate.cmddanelevate.vbs
Dijeda hingga pemberitahuan lebih lanjut.
Jika saya bisa mengemas semua ini sesuatu yang cukup mandiri / portabel, mungkin berhasil. Saya akan melihat lebih dekat ketika saya memiliki sedikit lebih banyak waktu hari ini.
jslaker
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Mark Henderson
4

Jika Anda siap mengonversi ke PowerShell ini jauh lebih mudah dilakukan. Ini Elevate-Process.ps1skrip " " saya (dengan sualias di profil saya):

# 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

Deteksi peningkatan juga dapat dilakukan di PSH (sehingga Anda dapat memeriksa ketinggian, dan kemudian meningkat jika diperlukan):

$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
sumber
Saya pikir Powershell dapat melakukan ini, tetapi sekali lagi, saya tidak dapat mengandalkan Powershell yang sedang diinstal, dan membutuhkan sesuatu yang sangat keras dan lupa mungkin.
jslaker
@ jslaker: itu pasti bisa menjadi masalah dengan Vista / 2008. Namun PSH sudah termasuk dengan Win7 / 2008R2 sehingga harus lebih mudah. Dalam situasi perusahaan, mungkinkah ini dorongan untuk memulai?
Richard
Yah, ini bukan situasi perusahaan. Ada lebih banyak pertanyaan asli yang saya tautkan, tetapi versi singkatnya adalah bahwa kami adalah bengkel PC, dan ini pada dasarnya semua berusaha untuk mengatasi bahwa lisensi WSUS melarang Anda menggunakan WSUS untuk menyebarkan pembaruan ke mesin yang tidak dilisensikan ke organisasi Anda. Ini semua adalah mesin pelanggan yang dapat menjalankan apa saja dari XP RTM ke atas. Inilah sebabnya mengapa saya tidak bisa benar-benar bergantung pada apa pun yang diinstal yang tidak akan dimasukkan dalam instalasi RTM dari OS yang diberikan.
jslaker
Jika Anda tidak dapat mengandalkan Powershell yang sedang diinstal, lihat jawaban yang saya berikan di bawah ini.
Matt
3

berikut ini contoh skrip yang saya buat, saya harap ini membantu orang lain. Ini adalah file bat yang meminta izin kepada pengguna dan kemudian meningkat dengan sendirinya. Ini mem-pipe keluar beberapa vbscript yang memicu prompt UAC dan kemudian menjalankan kembali file bat yang ditinggikan ... http://jagaroth.livejournal.com/63875.html

Hal
sumber
2

Inilah yang Anda butuhkan: http://sites.google.com/site/eneerge/home/BatchGotAdmin

Emilio
sumber
1
Skrip ini memiliki bug minor, tidak meneruskan parameter apa pun. Masukkan saja ke perintah untuk memanggil skrip Anda seperti ini: echo UAC.ShellExecute "% ~ s0", "% *", "", "runas", 1 >> "% temp% \ getadmin.vbs"
SvenS
1

FusionInventory.org adalah solusi open source yang kebanyakan digunakan oleh bengkel kecil. Ini bisa seperti windows updater pribadi Anda yang dikendalikan dari jarak jauh.

rjt
sumber
0

Tidak ada solusi yang berfungsi untuk file .cmd yang perlu mengetahui parameter baris perintah. Letakkan ini di awal file .cmd dan semua masalah Anda akan terpecahkan. (Ini untuk orang-orang masa depan yang menelusuri thread ini [Saya telah menguji ini pada windows XP, 7 Vista dan 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
sumber
0

Seperti yang dikatakan @emilio, skrip itu OK tapi tidak menerima argumen apa pun. Di sini skrip yang dimodifikasi agar kompatibel dengan argumen:

:: 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
sumber
0

Jika Anda tidak dapat mengandalkan Powershell yang sedang diinstal, Anda dapat mengambil solusi ini di StackOverflow:

angkat otomatis dengan UAC menggunakan file batch

Itu tidak memerlukan apa pun untuk diinstal dan kehabisan kotak. Jika Anda perlu mempertahankan argumen baris perintah, pertimbangkan pembaruan ini .

Mat
sumber
-1

Sudahkah Anda mencoba runasperintahnya?

Dijeda sampai pemberitahuan lebih lanjut.
sumber