Saya ingin file batch saya hanya berjalan tinggi. Jika tidak meningkat, berikan opsi bagi pengguna untuk meluncurkan kembali batch sebagai peningkatan.
Saya sedang menulis file batch untuk mengatur variabel sistem, menyalin dua file ke lokasi Program Files , dan memulai penginstal driver. Jika pengguna Windows 7 / Windows Vista ( UAC diaktifkan dan bahkan jika mereka adalah admin lokal) menjalankannya tanpa mengklik kanan dan memilih "Run as Administrator", mereka akan mendapatkan 'Akses Ditolak' menyalin dua file dan menulis variabel sistem .
Saya ingin menggunakan perintah untuk secara otomatis memulai ulang bets sebagai peningkatan jika pengguna sebenarnya adalah seorang administrator. Kalau tidak, jika mereka bukan administrator, saya ingin memberi tahu mereka bahwa mereka memerlukan hak administrator untuk menjalankan file batch. Saya menggunakan xcopy untuk menyalin file dan REG ADD untuk menulis variabel sistem. Saya menggunakan perintah itu untuk menangani kemungkinan mesin Windows XP. Saya telah menemukan pertanyaan serupa tentang topik ini, tetapi tidak ada yang berhubungan dengan meluncurkan kembali file batch yang meningkat.
sumber
@powershell Start-Process cmd -Verb runas
. Dari Powershell jatuhkan saja@powershell
. Ini dimulai cmd dengan hak tinggi.Jawaban:
Anda dapat memiliki script panggilan itu sendiri dengan PsExec 's
-h
pilihan untuk menjalankan ditinggikan.Saya tidak yakin bagaimana Anda akan mendeteksi jika sudah berjalan sebagai ditinggikan atau tidak ... mungkin coba lagi dengan perms tinggi hanya jika ada kesalahan Akses Ditolak?
Atau, Anda bisa saja memiliki perintah untuk
xcopy
danreg.exe
selalu dijalankanpsexec -h
, tetapi akan mengganggu bagi pengguna akhir jika mereka perlu memasukkan kata sandi setiap kali (atau tidak aman jika Anda memasukkan kata sandi dalam skrip) ...sumber
psexec -h
tidak berfungsi: 'Tidak dapat menginstal layanan PSEXESVC: Akses ditolak.' Anda harus sudah memiliki hak administrator untuk menjalankan psexec.Ada cara mudah tanpa perlu menggunakan alat eksternal - ini berjalan dengan baik dengan Windows 7, 8, 8.1 dan 10 dan juga kompatibel-mundur (Windows XP tidak memiliki UAC, sehingga peningkatan tidak diperlukan - dalam hal itu huruf skrip hanya melanjutkan).
Lihatlah kode ini (saya terinspirasi oleh kode oleh NIronwolf yang diposting di File Batch utas - "Akses Ditolak" Pada Windows 7? ), Tapi saya telah memperbaikinya - dalam versi saya tidak ada direktori yang dibuat dan dihapus untuk periksa hak administrator):
Script mengambil keuntungan dari fakta yang
NET FILE
membutuhkan hak administrator dan kembalierrorlevel 1
jika Anda tidak memilikinya. Ketinggian dicapai dengan membuat skrip yang meluncurkan kembali file batch untuk mendapatkan hak istimewa. Ini menyebabkan Windows menyajikan dialog UAC dan meminta Anda untuk akun administrator dan kata sandi.Saya telah mengujinya dengan Windows 7, 8, 8.1, 10 dan dengan Windows XP - ini berfungsi dengan baik untuk semua. Keuntungannya adalah, setelah titik awal Anda dapat menempatkan apa pun yang memerlukan hak administrator sistem, misalnya, jika Anda ingin menginstal ulang dan menjalankan kembali layanan Windows untuk keperluan debugging (diasumsikan bahwa mypackage.msi adalah paket pemasang layanan) :
Tanpa skrip pengangkat hak istimewa ini, UAC akan meminta Anda tiga kali untuk pengguna dan kata sandi administrator Anda - sekarang Anda hanya diminta satu kali di awal, dan hanya jika diperlukan.
Jika skrip Anda hanya perlu menampilkan pesan kesalahan dan keluar jika tidak ada hak administrator, bukan pengangkatan otomatis, ini bahkan lebih sederhana: Anda dapat mencapainya dengan menambahkan yang berikut di awal skrip Anda:
Dengan cara ini, pengguna harus mengklik kanan dan memilih "Run as administrator" . Script akan dilanjutkan setelah
REM
pernyataan jika mendeteksi hak administrator, jika tidak keluar dengan kesalahan. Jika Anda tidak memerlukannyaPAUSE
, hapus saja. Penting:NET FILE [...] EXIT /D)
harus di jalur yang sama. Ini ditampilkan di sini dalam beberapa baris untuk keterbacaan yang lebih baik!Pada beberapa mesin, saya mengalami masalah, yang sudah diselesaikan pada versi baru di atas. Salah satunya adalah karena penanganan penawaran ganda yang berbeda, dan masalah lainnya adalah karena fakta bahwa UAC dinonaktifkan (diatur ke level terendah) pada mesin Windows 7, karenanya skrip menyebut dirinya berulang kali.
Saya telah memperbaikinya sekarang dengan menghilangkan tanda kutip di jalur dan menambahkannya kembali nanti, dan saya telah menambahkan parameter tambahan yang ditambahkan ketika skrip diluncurkan kembali dengan hak yang ditingkatkan.
Kutipan ganda dihapus oleh yang berikut (detail ada di sini ):
Anda kemudian dapat mengakses jalur dengan menggunakan
!batchPath!
. Itu tidak mengandung tanda kutip ganda, jadi aman untuk mengatakannya"!batchPath!"
nanti dalam skrip.Garis
memeriksa apakah skrip telah dipanggil oleh skrip VBScript untuk meningkatkan hak, sehingga menghindari rekursi yang tak ada habisnya. Ini menghapus parameter menggunakan
shift
.Memperbarui:
Untuk menghindari harus mendaftarkan
.vbs
ekstensi di Windows 10 , saya telah mengganti baris"%temp%\OEgetPrivileges.vbs"
dengan
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
skrip di atas; juga ditambahkan
cd /d %~dp0
seperti yang disarankan oleh Stephen (jawaban terpisah) dan oleh Tomáš Zato (komentar) untuk menetapkan direktori skrip sebagai default.Sekarang skrip menghormati parameter baris perintah yang diteruskan ke sana. Berkat jxmallet, TanisDLJ dan Peter Mortensen untuk pengamatan dan inspirasi.
Menurut petunjuk Artjom B., saya menganalisanya dan telah menggantinya
SHIFT
denganSHIFT /1
, yang mempertahankan nama file untuk%0
parameterDitambahkan
del "%temp%\OEgetPrivileges_%batchName%.vbs"
ke:gotPrivileges
bagian untuk membersihkan (sebagai MLT disarankan). Ditambahkan%batchName%
untuk menghindari dampak jika Anda menjalankan batch berbeda secara paralel. Perhatikan bahwa Anda perlu menggunakanfor
untuk dapat memanfaatkan fungsi string lanjutan, seperti%%~nk
, yang mengekstrak hanya nama file.Struktur skrip yang dioptimalkan, perbaikan (variabel tambahan
vbsGetPrivileges
yang sekarang direferensikan di mana-mana memungkinkan untuk mengubah jalur atau nama file dengan mudah, hanya menghapus.vbs
file jika batch perlu ditingkatkan)Dalam beberapa kasus, sintaks panggilan yang berbeda diperlukan untuk elevasi. Jika skrip tidak berfungsi, periksa parameter berikut:
set cmdInvoke=0
set winSysFolder=System32
Ubah parameter 1 ke
set cmdInvoke=1
dan periksa apakah sudah memperbaiki masalah. Ini akan menambahcmd.exe
skrip yang melakukan elevasi.Atau coba ubah parameter ke-2
winSysFolder=Sysnative
, ini mungkin membantu (tetapi dalam banyak kasus tidak diperlukan) pada sistem 64 bit. (ADBailey telah melaporkan ini). "Sysnative" hanya diperlukan untuk meluncurkan aplikasi 64-bit dari host skrip 32-bit (mis. Proses pembuatan Visual Studio, atau permintaan skrip dari aplikasi 32-bit lainnya).Untuk membuatnya lebih jelas bagaimana parameter ditafsirkan, saya menampilkannya sekarang seperti
P1=value1 P2=value2 ... P9=value9
. Ini sangat berguna jika Anda perlu menyertakan parameter seperti jalur dalam tanda kutip ganda, misalnya"C:\Program Files"
.Jika Anda ingin men-debug skrip VBS, Anda dapat menambahkan
//X
parameter ke WScript.exe sebagai parameter pertama, seperti yang disarankan di sini (dijelaskan untuk CScript.exe, tetapi juga berfungsi untuk WScript.exe).Tautan yang bermanfaat:
Kutipan (") , Bang (!) , Caret (^) , Ampersand (&) , karakter khusus lainnya
sumber
Seperti yang disebutkan jcoder dan Matt, PowerShell membuatnya mudah, dan itu bahkan bisa tertanam dalam skrip batch tanpa membuat skrip baru.
Saya memodifikasi skrip Matt:
sumber
WorkingDirectory
parameterStart-Process
karena alasan keamanan dalamrunas
prosesSaya menggunakan jawaban Matt yang sangat baik, tetapi saya melihat perbedaan antara sistem Windows 7 dan Windows 8 saya ketika menjalankan skrip yang ditinggikan.
Setelah skrip diangkat pada Windows 8, direktori saat ini diatur ke
C:\Windows\system32
. Untungnya, ada solusi yang mudah dengan mengubah direktori saat ini ke jalur skrip saat ini:Catatan: Gunakan
cd /d
untuk memastikan huruf drive juga berubah.Untuk menguji ini, Anda dapat menyalin yang berikut ini ke skrip. Jalankan secara normal di kedua versi untuk melihat hasil yang sama. Jalankan sebagai Admin dan lihat perbedaan pada Windows 8:
sumber
cd %~dp0
mempertahankan jalurnya saat ini (saya berasumsi ini berfungsi di Win7 juga, jadi perintah yang sama dapat digunakan meskipun hanya diperlukan untuk Win8 +). +1 untuk ini!pushd %~dp0
saja ... mengapa? karenapopd
Saya melakukannya dengan cara ini:
Dengan cara ini sederhana dan hanya menggunakan perintah standar windows. Ini bagus jika Anda perlu mendistribusikan file batch Anda.
CD /d %~dp0
Setel direktori saat ini ke direktori file saat ini (jika belum, terlepas dari drive file yang ada, berkat/d
opsi).%~nx0
Mengembalikan nama file saat ini dengan ekstensi (Jika Anda tidak menyertakan ekstensi dan ada exe dengan nama yang sama pada folder, itu akan memanggil exe).Ada begitu banyak balasan pada posting ini, saya bahkan tidak tahu apakah balasan saya akan terlihat.
Lagi pula, saya menemukan cara ini lebih sederhana daripada solusi lain yang diusulkan pada jawaban lain, saya harap ini membantu seseorang.
sumber
/d
. Terima kasih sobat :) (PS: Pianis di sini juga!)cd
perintah ke awal (ini memastikan bahwa path juga tersedia untuk skrip yang ditinggikan - jika skrip yang ditinggikan hanya berjalan dari system32). Anda juga harus mengarahkan ulang perintah net ke nul untuk menyembunyikan outputnya:net session >nul 2>&1
Matt memiliki jawaban yang bagus, tetapi menghapus semua argumen yang dilewatkan ke skrip. Ini modifikasi saya yang menyimpan argumen. Saya juga memasukkan perbaikan Stephen untuk masalah direktori kerja di Windows 8.
sumber
ECHO UAC.ShellExecute....
sejalan,"batchArgs!"
tidak akan memperluas variabel. Gunakan"!batchArgs!"
. Hasil edit saya ditolak, jadi saya berkomentar.test.bat "a thing"
atau"test script.bat" arg1 arg2
. Semua sudah diperbaiki sekarang.Saya menggunakan PowerShell untuk meluncurkan kembali script yang ditinggikan jika tidak. Letakkan baris ini di bagian paling atas dari skrip Anda.
Saya menyalin metode 'nama bersih' dari jawaban @ Matt. Jawabannya jauh lebih baik didokumentasikan dan memiliki pesan kesalahan dan sejenisnya. Yang ini memiliki keunggulan bahwa PowerShell sudah diinstal dan tersedia pada Windows 7 dan yang lebih tinggi. Tidak ada file VBScript (* .vbs) sementara, dan Anda tidak perlu mengunduh alat.
Metode ini harus berfungsi tanpa konfigurasi atau pengaturan apa pun, selama izin eksekusi PowerShell Anda tidak dikunci.
sumber
/c %~fnx0 %*'
bagian tampaknya meninggalkan setiap bagian selain yang pertama. Misalnya daritest.bat "arg1 arg2 arg3"
hanya arg1 yang diteruskannetsh int set int %wifiname% Enable/Disable
.net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c ""%~fnx0""""'"
Untuk beberapa program, pengaturan
__COMPAT_LAYER
variabel lingkungan super rahasiaRunAsInvoker
akan berfungsi. Periksa ini:Meskipun seperti ini tidak akan ada UAC yang meminta pengguna akan melanjutkan tanpa izin admin.
sumber
regedit
. Itu hanya melewatkan uac.Saya menempelkan ini di awal skrip:
sumber
cacls
sudah usang di Windows 7 dan versi windows yang lebih baru.pushd "%CD%"
menyimpan direktori kerja saat ini dan perubahan ke direktori kerja saat ini?Saya menulis
gsudo
, asudo
for windows : yang naik di konsol saat ini (tidak ada konteks beralih ke jendela baru), dengan cache kredensial (mengurangi popup UAC), dan juga meninggikan perintah PowerShell .Ini memungkinkan untuk meninggikan perintah yang memerlukan hak admin, atau seluruh kumpulan, jika Anda mau. Hanya tambahkan
gsudo
sebelum apa pun yang perlu dijalankan ditinggikan.Contoh file batch yang naik sendiri menggunakan gsudo:
EDIT: Versi one liner baru yang berfungsi dengan bahasa windows apa pun dan menghindari masalah whoami :
Alternatif (versi asli):
Install:
choco install gsudo
scoop install gsudo
Lihat gsudo sedang beraksi:
sumber
.Net Framework 4.6
sana. Untungnyachoco install dotnet4.6.2
membawa beberapa dependensi yang sulit didapat. Kemudiangsudo config Prompt "$p# "
memperbaiki masalah denganConHost
menampilkan prompt yang salah (escape sequence chars bukannya red sharp). @RockPaperLizardMeskipun tidak secara langsung berlaku untuk pertanyaan ini, karena ingin beberapa informasi untuk pengguna, google membawa saya ke sini ketika saya ingin menjalankan file .bat saya yang diangkat dari penjadwal tugas.
Pendekatan yang paling sederhana adalah membuat pintasan ke file .bat, karena untuk pintasan Anda dapat mengatur
Run as administrator
langsung dari properti tingkat lanjut.Menjalankan pintasan dari penjadwal tugas, menjalankan file .bat terangkat.
sumber
Jika Anda tidak perlu melewati argumen maka inilah skrip prompt UAC ringkas yang panjangnya satu baris. Ini melakukan hal yang sama dengan skrip elevasi di bagian atas memilih jawaban tetapi tidak lolos argumen karena tidak ada cara mudah untuk melakukan itu yang menangani setiap kombinasi yang mungkin dari karakter racun.
sumber
Menggunakan PowerShell.
Jika file cmd panjang, saya menggunakan yang pertama membutuhkan elevasi dan kemudian memanggil yang melakukan pekerjaan yang sebenarnya.
Jika skrip adalah perintah sederhana semuanya mungkin muat pada satu file cmd. Jangan lupa menyertakan path pada file skrip.
Templat:
Contoh 1:
Contoh 2:
sumber
Coba ini:
Jika Anda memerlukan informasi tentang file kumpulan itu, jalankan Cuplikan HTML / JS / CSS:
sumber
Solusi berikut ini bersih dan berfungsi dengan baik.
Unduh Tinggikan file zip dari https://www.winability.com/download/Elevate.zip
Di dalam zip Anda harus menemukan dua file: Elevate.exe dan Elevate64.exe. (Yang terakhir adalah kompilasi 64-bit asli, jika Anda mengharuskan itu, meskipun versi 32-bit reguler, Elevate.exe, harus bekerja dengan baik dengan versi Windows 32-dan 64-bit)
Salin file Elevate.exe ke folder di mana Windows selalu dapat menemukannya (seperti C: / Windows). Atau Anda lebih baik Anda dapat menyalin di folder yang sama di mana Anda berencana untuk menyimpan file bat Anda.
Untuk menggunakannya dalam file batch, cukup tambahkan perintah yang ingin Anda jalankan sebagai administrator dengan perintah elevate, seperti ini:
sumber