Harici bir araç kullanmaya gerek kalmadan kolay bir yol vardır - Windows 7, 8, 8.1 ve 10 ile iyi çalışır ve geriye dönük olarak da uyumludur (Windows XP'de UAC yoktur, bu nedenle yükseklik gerekmez - betiğin ilerlemesi durumunda).
Bu kodu göz atın (Ben iş parçacığında yayınlanan NIronwolf tarafından kod esinlenerek Toplu Dosya - "Erişim Engellendi" Windows 7? ), Ama ben geliştirdim - benim sürümde oluşturulan ve kaldırıldı herhangi bir dizin yok yönetici ayrıcalıklarını kontrol edin):
::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
:: see "https://stackoverflow.com/a/12264592/1016343" for description
::::::::::::::::::::::::::::::::::::::::::::
@echo off
CLS
ECHO.
ECHO =============================
ECHO Running Admin shell
ECHO =============================
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
if '%cmdInvoke%'=='1' goto InvokeCmd
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
goto ExecElevation
:InvokeCmd
ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"
:ExecElevation
"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
REM Run shell as admin (example) - put here code as you like
ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
cmd /k
Komut dosyası, NET FILE
yönetici ayrıcalığı gerektiren errorlevel 1
durumdan yararlanır ve sahip değilseniz geri döner . Yükseltme, ayrıcalıklar elde etmek için toplu iş dosyasını yeniden başlatan bir komut dosyası oluşturarak elde edilir. Bu, Windows'un UAC iletişim kutusunu göstermesine neden olur ve yönetici hesabı ve parola ister.
Windows 7, 8, 8.1, 10 ve Windows XP ile test ettim - herkes için iyi çalışıyor. Bunun avantajı, başlangıç noktasından sonra, örneğin bir Windows hizmetini hata ayıklama amacıyla yeniden yüklemek ve yeniden çalıştırmak istiyorsanız (mypackage.msi dosyasının bir hizmet yükleyici paketi olduğu varsayılırsa) sistem yöneticisi ayrıcalıkları gerektiren her şeyi yerleştirebilirsiniz. :
msiexec /passive /x mypackage.msi
msiexec /passive /i mypackage.msi
net start myservice
Bu ayrıcalık yükseltme betiği olmadan, UAC size yönetici kullanıcı ve şifrenizi üç kez soracaktır - şimdi sizden yalnızca bir kez başlangıçta ve sadece gerekirse istenir.
Komut dosyanızın yalnızca bir hata mesajı göstermesi ve otomatik yükseltme yerine yönetici ayrıcalıkları yoksa çıkması gerekiyorsa , bu daha da basittir: Komut dosyanızın başına aşağıdakileri ekleyerek bunu elde edebilirsiniz:
@ECHO OFF & CLS & ECHO.
NET FILE 1>NUL 2>NUL & IF ERRORLEVEL 1 (ECHO You must right-click and select &
ECHO "RUN AS ADMINISTRATOR" to run this batch. Exiting... & ECHO. &
PAUSE & EXIT /D)
REM ... proceed here with admin rights ...
Bu şekilde, kullanıcının sağ tıklaması ve "Yönetici olarak çalıştır" ı seçmesi gerekir . Komut dosyası, REM
yönetici haklarını algılarsa ifadeden sonra devam eder, aksi takdirde bir hata ile çıkılır. Gereksinim duymuyorsanız PAUSE
, kaldırın.
Önemli: NET FILE [...] EXIT /D)
aynı satırda olmalıdır. Daha iyi okunabilirlik için burada birden fazla satırda görüntülenir!
Bazı makinelerde, yukarıdaki yeni sürümde çözülen sorunlarla karşılaştım. Birincisi farklı çift tırnak işleminden kaynaklanmıştı ve diğer sorun, UAC'nin bir Windows 7 makinesinde devre dışı bırakılması (en düşük seviyeye ayarlanmış) nedeniyle, betiğin kendisini tekrar tekrar çağırmasıydı.
Ben şimdi tırnak tırnak yolunda sıyırma ve daha sonra yeniden ekleyerek düzeltildi ve komut dosyası yükseltilmiş haklarla yeniden başlatıldığında eklenen ekstra bir parametre ekledim.
Çift tırnak işaretleri aşağıdakiler tarafından kaldırılır (ayrıntılar buradadır ):
setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
Ardından yolu kullanarak erişebilirsiniz !batchPath!
. Herhangi bir çift tırnak içermez, bu yüzden "!batchPath!"
komut dosyasında daha sonra söylemek güvenlidir .
Çizgi
if '%1'=='ELEV' (shift & goto gotPrivileges)
betiğin VBScript betiği tarafından hakları yükseltmek için çağrılıp çağrılmadığını kontrol eder , böylece sonsuz özyinelemeleri önler. Kullanarak parametreyi kaldırır shift
.
Güncelleme:
Kayıt zorunda kalmamak için .vbs
uzantı , Windows 10 , ben çizgiyi yerini almıştır
"%temp%\OEgetPrivileges.vbs"
tarafından
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
komut yukarıdaki; Ayrıca cd /d %~dp0
Stephen (ayrı cevap) ve Tomáš Zato (yorum) tarafından önerildiği gibi komut dizini varsayılan olarak ayarlamak için eklendi.
Komut dosyası, kendisine iletilen komut satırı parametrelerini onurlandırıyor. Gözlemler ve ilhamlar için jxmallet, TanisDLJ ve Peter Mortensen'e teşekkürler.
Artjom B.'nin ipucu göre, bunu analiz ve yerini SHIFT
tarafından SHIFT /1
dosya adını korur, hangi %0
parametre
Temizlemek del "%temp%\OEgetPrivileges_%batchName%.vbs"
için :gotPrivileges
bölüme eklendi ( mlt önerildiği gibi). Eklenen %batchName%
Eğer paralel olarak farklı toplu çalıştırırsanız etkisini önlemek için. Yalnızca dosya adını ayıklayan for
gibi gelişmiş dize işlevlerinden yararlanabilmek için kullanmanız gerektiğini unutmayın %%~nk
.
Optimize edilmiş komut dosyası yapısı, iyileştirmeler ( vbsGetPrivileges
artık her yerde referans verilen ve dosyanın yolunu veya adını kolayca değiştirmeye izin veren değişken eklendi , yalnızca .vbs
toplu işin yükseltilmesi gerekiyorsa dosyayı silin )
Bazı durumlarda, yükseklik için farklı bir çağrı sözdizimi gerekiyordu. Komut dosyası çalışmazsa, aşağıdaki parametreleri kontrol edin:
set cmdInvoke=0
set winSysFolder=System32
1. parametreyi değiştirin set cmdInvoke=1
ve sorunun giderilip giderilmediğini kontrol edin. cmd.exe
Yüksekliği gerçekleştiren komut dosyasına eklenir .
Veya 2. parametreyi değiştirmeye çalışın winSysFolder=Sysnative
, bu 64 bit sistemlerde yardımcı olabilir (ancak çoğu zaman gerekli değildir). (ADBailey bunu bildirdi). "Sysnative" yalnızca 32-bit komut dosyası ana bilgisayarından 64-bit uygulamaları başlatmak için gereklidir (örneğin, bir Visual Studio oluşturma işlemi veya başka bir 32-bit uygulamadan komut dosyası çağırma).
Parametrelerin nasıl yorumlandığını daha açık hale getirmek için, şimdi onu gösteriyorum P1=value1 P2=value2 ... P9=value9
. Bu, özellikle yollar gibi parametreleri çift tırnak içine almanız gerektiğinde kullanışlıdır "C:\Program Files"
.
VBS komut dosyasında hata ayıklamak istiyorsanız, //X
parametreyi burada önerildiği gibi ilk parametre olarak WScript.exe dosyasına ekleyebilirsiniz (CScript.exe için açıklanmıştır, ancak WScript.exe için de çalışır).
Kullanışlı bağlantılar: