Bagaimana cara mendeteksi jika CMD berjalan sebagai Administrator / memiliki hak istimewa?

101

Dari dalam file batch, saya ingin menguji apakah saya menjalankan dengan Administrator / hak istimewa yang ditinggikan.

Nama pengguna tidak berubah ketika "Jalankan sebagai Administrator" dipilih, jadi itu tidak berfungsi.

Jika ada perintah yang tersedia secara universal, yang tidak berpengaruh, tetapi memerlukan hak akses administratif, maka saya dapat menjalankannya dan memeriksa kode kesalahan untuk menguji hak istimewa. Sejauh ini, saya belum menemukan perintah seperti itu. Perintah yang saya temukan tampaknya mengembalikan satu kode kesalahan non-spesifik, yang dapat menunjukkan apa pun, dan mereka cenderung gagal karena berbagai alasan.

Saya hanya peduli dengan Windows 7, meskipun dukungan sistem operasi sebelumnya akan menyenangkan.

Jeff
sumber
Satu peretasan akan dicoba dan dilakukan echo > somefileke direktori yang akan membutuhkan admin privs. itu akan menghasilkan file sebagai efek samping, tetapi Anda dapat memeriksa tabrakan dan membuat nama file unik sebagai solusinya.
Marc B
5
kemungkinan duplikat dari skrip Batch: cara memeriksa hak admin
npocmaka
1
[Anda dapat menemukan tumpukan self-elevating di sini] [1] [1]: stackoverflow.com/questions/4051883/…
Amr Ali
kemungkinan duplikat dari Cara meminta akses Administrator di dalam file batch
Jim Fell
1
@npocmaka pertanyaan yang Anda tautkan sebenarnya adalah duplikat dari pertanyaan ini;) (2013 vs. 2011)
Matthieu

Jawaban:

62

TAMBAHAN : Untuk Windows 8 ini tidak akan berhasil; lihat jawaban yang sangat bagus ini sebagai gantinya.


Temukan solusi ini di sini: http://www.robvanderwoude.com/clevertricks.php

AT > NUL
IF %ERRORLEVEL% EQU 0 (
    ECHO you are Administrator
) ELSE (
    ECHO you are NOT Administrator. Exiting...
    PING 127.0.0.1 > NUL 2>&1
    EXIT /B 1
)

Dengan asumsi itu tidak berhasil dan karena kita berbicara tentang Win7 Anda dapat menggunakan yang berikut ini di Powershell jika itu cocok:

$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

Jika tidak (dan mungkin tidak, karena Anda secara eksplisit mengusulkan file batch) maka Anda dapat menulis di atas dalam .NET dan mengembalikan kode keluar dari exe berdasarkan hasil untuk digunakan file batch Anda.

Rushyo
sumber
4
Perintah AT sempurna! Google-fu Anda lebih unggul dari Google-fu saya. ;-)
Jeff
2
+1 @Rushyo, saya memperpanjang solusi Anda sedikit dan mempostingnya di sini karena itulah yang pertama kali saya temukan. Terima kasih! stackoverflow.com/questions/4051883/…
blak3r
16
ATtidak berfungsi di Windows 8, tetapi saya telah menemukan solusi yang lebih baik. Saya telah mempostingnya sebagai jawaban untuk pertanyaan lain, di sini: stackoverflow.com/questions/4051883/… .
Mythofechelon
4
Saya merekomendasikan whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Grup yang diaktifkan" && echo "Saya memiliki admin!" - bekerja pada 95, 98, 2000, xp, vista, 7, 8! (Dari komentar "Saya suka saran Rushyo menggunakan AT ...")
barwnikk
1
Saya suka pingmengganti sleep:)
Matthieu
96

Trik ini hanya membutuhkan satu perintah: ketik net sessiondi command prompt.

Jika Anda BUKAN admin , Anda mendapatkan pesan akses ditolak.

System error 5 has occurred.

Access is denied.

Jika Anda ADALAH admin , Anda mendapatkan pesan yang berbeda, yang paling umum adalah:

There are no entries in the list.

Dari MS Technet :

Digunakan tanpa parameter, sesi bersih menampilkan informasi tentang semua sesi dengan komputer lokal.

Ambrose Leung
sumber
Itu secara fungsional identik dengan jawaban Rushyo, yang menggunakan perintah AT.
Jeff
12
Pada Windows 8.1, ini lebih disukai daripada AT, karena AT sudah tidak digunakan lagi. Menggunakan jawaban Rushyo tetapi mengganti AT dengan sesi net atau sesi net.exe berfungsi dengan baik untuk saya.
kayleeFrye_onDeck
Ini tampaknya cara termudah untuk melakukan ini pada command prompt (yang berbeda dari file batch, meskipun).
enderland
2
Baru saja mencetak There are no entries in the list.di Windows 10 Pro
gman
1
dalam file batch gunakan sesuatu seperti itu:net session >nul 2>&1 || (echo not admin&goto :eof)
anilech
27

Saya suka saran Rushyo untuk menggunakan AT, tetapi ini adalah opsi lain:

whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator

Pendekatan ini juga memungkinkan Anda untuk membedakan antara non-administrator dan administrator non-tinggi jika Anda menginginkannya. Administrator yang tidak ditinggikan masih memiliki BUILTIN \ Administrators dalam daftar grup tetapi tidak diaktifkan.

Namun, ini tidak akan berfungsi pada beberapa sistem bahasa non-Inggris. Sebaliknya, cobalah

whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator

(Ini seharusnya berfungsi pada Windows 7 tetapi saya tidak yakin tentang versi sebelumnya.)

Harry Johnston
sumber
1
Dalam versi polandia, saya memiliki: BUILTIN \ Administratorzy, jadi, saya merekomendasikan: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Grup yang diaktifkan" && goto: isadministrator
barwnikk
@barwnikk, saya sarankan whoami/groupsdan kemudian memindai baris secara manual. Tidak akan memakan waktu lama dan perintahnya pas di otak Anda.
Pacerier
@Pacerier: inti pertanyaannya adalah untuk mendeteksi ketinggian dalam file batch . Jika seseorang berada di baris perintah, yang perlu mereka lakukan hanyalah melihat judul jendela, yang selalu memulai "Administrator:" jika Anda diangkat.
Harry Johnston
@HarryJohnston, Wow tidak menyadarinya. Apakah judul "Administrator" muncul untuk semua versi windows?
Pacerier
@Pacerier: semua versi saat ini (Vista dan seterusnya).
Harry Johnston
24

Cukup banyak apa yang orang lain telah letakkan sebelumnya, tetapi sebagai satu liner yang dapat diletakkan di awal perintah batch. (Yah, biasanya setelah @echo off.)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
geek_01
sumber
2
Ini adalah versi terbaru dan menyembunyikan keluaran yang tidak relevan dari net.exe dengan baik
andersand
2
Bekerja dengan baik pada Windows 10.
James Pack
Berhasil, cukup atur bagian akhir ke & Timeout / t 10 & Exit / b 1) sehingga dalam file batch, jendela tidak langsung menghilang.
WhoIsRich
12

Cara termudah untuk melakukan ini di Vista, Win 7 dan yang lebih baru adalah menghitung grup token dan mencari tingkat integritas saat ini (atau sisi administrator, jika hanya keanggotaan grup yang penting):

Periksa apakah kami menjalankan peningkatan:

whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-)

Periksa apakah kami milik administrator lokal:

whoami /groups | find "S-1-5-32-544" && Echo I am a local admin

Periksa apakah kami termasuk dalam admin domain:

whoami /groups | find "-512 " && Echo I am a domain admin

Artikel berikut mencantumkan tingkat integritas SID yang digunakan windows: http://msdn.microsoft.com/en-us/library/bb625963.aspx

Martin Binder
sumber
whoami / groups memiliki kasus tepi di mana Anda mendapatkan informasi yang salah. Lihat stackoverflow.com/questions/4051883/…
zumalifeguard
7

Berikut sedikit modifikasi dari jawaban Harry yang berfokus pada status yang lebih tinggi; Saya menggunakan ini di awal file install.bat:

set IS_ELEVATED=0
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1
if %IS_ELEVATED%==0 (
    echo You must run the command prompt as administrator to install.
    exit /b 1
)

Ini pasti berhasil bagi saya dan prinsipnya tampaknya masuk akal; dari MSFT Chris Jackson :

Saat Anda menjalankan ditinggikan, token Anda berisi ACE yang disebut Label Wajib \ Tingkat Wajib Tinggi.

Hugh
sumber
whoami / groups memiliki kasus tepi di mana Anda mendapatkan informasi yang salah. Lihat stackoverflow.com/questions/4051883/…
zumalifeguard
7

solusinya:

at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

tidak berfungsi di bawah Windows 10

untuk semua versi Windows dapat melakukannya:

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
ipAlex
sumber
6

Saya membaca banyak (sebagian besar?) Tanggapan, kemudian mengembangkan file bat yang berfungsi untuk saya di Win 8.1. Kupikir aku akan membagikannya.

setlocal
set runState=user
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" > nul && set runState=admin
whoami /groups | findstr /b /c:"Mandatory Label\System Mandatory Level" > nul && set runState=system
echo Running in state: "%runState%"
if not "%runState%"=="user" goto notUser
  echo Do user stuff...
  goto end
:notUser
if not "%runState%"=="admin" goto notAdmin
  echo Do admin stuff...
  goto end
:notAdmin
if not "%runState%"=="system" goto notSystem
  echo Do admin stuff...
  goto end
:notSystem
echo Do common stuff...
:end

Semoga seseorang menemukan ini berguna :)

GeoffH
sumber
whoami / groups memiliki kasus tepi di mana Anda mendapatkan informasi yang salah. Lihat stackoverflow.com/questions/4051883/…
zumalifeguard
Terima kasih untuk ini! Solusi "whoami" lainnya tidak berfungsi untuk saya di Windows 8.1. Yang ini berhasil.
Ryan
1

Saya tahu saya sangat terlambat ke pesta ini, tapi inilah satu kalimat saya untuk menentukan admin-hood.

Itu tidak bergantung pada tingkat kesalahan, hanya pada systeminfo:

for /f "tokens=1-6" %%a in ('"net user "%username%" | find /i "Local Group Memberships""') do (set admin=yes & if not "%%d" == "*Administrators" (set admin=no) & echo %admin%)

Ini mengembalikan ya atau tidak, tergantung pada status admin pengguna ...

Ini juga menetapkan nilai variabel "admin" sama dengan ya atau tidak.

pengguna1
sumber
Ini hanya akan bekerja jika pengguna adalah anggota langsung dari grup lokal Administrator. Jika pengguna adalah anggota grup domain (misalnya, "Admin Domain") yang merupakan anggota grup Administrator, itu tidak akan berfungsi.
Harry Johnston
1

Jika Anda menjalankan sebagai pengguna dengan hak administrator maka variabel lingkungan SessionName TIDAK akan ditentukan dan Anda masih tidak memiliki hak administrator saat menjalankan file batch.

Anda harus menggunakan perintah "sesi bersih" dan mencari kode kesalahan kembali "0" untuk memverifikasi hak administrator.

Contoh; - Pernyataan gema pertama adalah karakter bel net session >nul 2>&1 if not %errorlevel%==0 (echo echo You need to start over and right-click on this file, echo then select "Run as administrator" to be successfull. echo.&pause&exit)

Wolfgang
sumber
0

Berikut adalah metode sederhana yang saya gunakan pada Windows 7 hingga Windows 10. Pada dasarnya, saya cukup menggunakan perintah "JIKA ADA" untuk memeriksa folder Windows \ System32 \ WDI \ LogFiles. Folder WDI ada di setiap penginstalan Windows setidaknya dari 7 dan seterusnya, dan memerlukan hak admin untuk mengakses. Folder WDI selalu memiliki folder LogFiles di dalamnya. Jadi, menjalankan "JIKA ADA" di folder WDI \ LogFiles akan mengembalikan nilai true jika dijalankan sebagai admin, dan false jika tidak dijalankan sebagai admin. Ini dapat digunakan dalam file batch untuk memeriksa tingkat hak istimewa, dan bercabang ke perintah mana pun yang Anda inginkan berdasarkan hasil itu.

Berikut cuplikan singkat kode contoh:

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)

:GOTADMIN
(Commands for running with admin privileges)

Ingatlah bahwa metode ini mengasumsikan izin keamanan default belum diubah di folder WDI (yang tidak mungkin terjadi di sebagian besar situasi, tetapi harap lihat peringatan # 2 di bawah). Bahkan dalam kasus itu, itu hanya masalah memodifikasi kode untuk memeriksa file / folder umum yang berbeda yang memerlukan akses admin (System32 \ config \ SAM mungkin merupakan kandidat alternatif yang baik), atau Anda bahkan dapat membuatnya sendiri khusus untuk itu tujuan.

Ada dua peringatan tentang metode ini:

  1. Menonaktifkan UAC kemungkinan akan memecahkannya melalui fakta sederhana bahwa semuanya akan tetap dijalankan sebagai admin.

  2. Mencoba membuka folder WDI di Windows Explorer dan kemudian mengklik "Lanjutkan" saat diminta akan menambahkan hak akses permanen untuk akun pengguna tersebut, sehingga merusak metode saya. Jika ini terjadi, dapat diperbaiki dengan menghapus akun pengguna dari izin keamanan folder WDI. Jika karena alasan apa pun pengguna HARUS dapat mengakses folder WDI dengan Windows Explorer, maka Anda harus mengubah kode untuk memeriksa folder lain (seperti yang disebutkan di atas, membuat sendiri secara khusus untuk tujuan ini mungkin merupakan pilihan yang baik) .

Jadi, memang metode saya tidak sempurna karena dapat dipecahkan, tetapi ini adalah metode yang relatif cepat yang mudah diterapkan, sama-sama kompatibel dengan semua versi Windows 7, 8 dan 10, dan asalkan saya tetap memperhatikan peringatan yang disebutkan. 100% efektif untuk saya.

Torin Darkflight
sumber
0

Bekerja untuk Win7 Enterprise dan Win10 Enterprise

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
englebart
sumber