Periksa apakah Prompt Perintah saat ini diluncurkan sebagai Administrator

21

Saya ingin menulis skrip yang mengambil input pengguna, lalu membuat perubahan sistem yang luas. Saya ingin ini sangat generik, tetapi cukup, di bagian atas, saya perlu memeriksa apakah ini dijalankan sebagai 'Sebagai Administrator'. Jika tidak, maka saya ingin menampilkan pesan untuk memberi tahu mereka; jika ya, saya ingin melanjutkan. Apakah ada cara konstan untuk memverifikasi ini? Saya tidak ingin memulai sesi baru sebagai Administrator, saya hanya ingin mendeteksi apakah saat ini dijalankan sebagai admin

Luke Kanada REINSTATE MONICA
sumber
@ g-man bagaimana ini terkait?
Luke Kanada REINSTATE MONICA
Itu juga meminta perintah yang akan berperilaku berbeda jika dijalankan Sebagai Administrator atau tidak - atau setidaknya itu yang diterima sebagai jawaban.
G-Man Mengatakan 'Reinstate Monica'

Jawaban:

16

Temukan ini di Stack Overflow :

@echo off
goto check_Permissions

:check_Permissions
echo Administrative permissions required. Detecting permissions...

net session >nul 2>&1
if %errorLevel% == 0 (
    echo Success: Administrative permissions confirmed.
) else (
    echo Failure: Current permissions inadequate.
)

pause >nul
Alex
sumber
Apa alasannya dihapus?
Luke Kanada REINSTATE MONICA
Ini berfungsi, baik dari akun Administrator, dan ketika saya menjalankan sebagai pengguna terbatas, tetapi pilih 'Jalankan sebagai Administrator'
Luke Kanada REINSTATE MONICA
2
Ide yang sama, tetapi menggunakan operator eksekusi kondisional: net session >nul 2>&1 && echo Success || echo Failure. Saya menemukan sintaks yang ringkas ini lebih nyaman.
dbenham
6
Ini membutuhkan layanan "Server" untuk dapat berjalan.
ivan_pozdeev
8

Ini memeriksa tingkat integritas tinggi. (berfungsi untuk Windows Vista dan lebih tinggi)

@echo off

whoami /groups | find "S-1-16-12288" > nul

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)
minggu
sumber
1
whoami tidak didukung di xp awnser saya lebih baik mendukung semua os dari windows xp ke windows 8
Alex
2
Ini berfungsi jika saya baru saja membuka Command Prompt. Jika saya menjalankan CMD Sebagai Administrator, itu masih menunjukkan bahwa itu dijalankan sebagai pengguna
Luke Kanada REINSTATE MONICA
2
@Alex Support untuk lebih banyak OS bagus, tetapi metode ini lebih dapat diandalkan karena langsung menanyakan izin yang diberikan ke sesi saat ini alih-alih mengambil tidak adanya negatif yang kurang dapat diandalkan untuk menyimpulkan positif.
Iszi
2
minggu, whoami / kelompok memiliki kasus tepi di mana Anda mendapatkan informasi yang salah. Lihat stackoverflow.com/questions/4051883/…
zumalifeguard
1
@week whoamihilang di XP.
ivan_pozdeev
4

Banyak, banyak jawaban untuk ini dan beberapa pertanyaan lain di seluruh SE ( 1 , 2 , 3 untuk beberapa nama), yang semuanya kekurangan dalam cara ini atau yang lain, telah dengan jelas menunjukkan bahwa Windows tidak menyediakan utilitas bawaan yang andal . Jadi, sekarang saatnya untuk meluncurkan milik Anda sendiri.

Tanpa peretasan kotor lebih lanjut:

Kompilasi program berikut (ikuti petunjuk), atau dapatkan salinan yang telah dikompilasi . Ini hanya perlu dilakukan sekali, maka Anda dapat menyalin di .exemana - mana (misalnya di samping Sysinternals Suite ).

Kode bekerja di Win2k + 1 , baik dengan dan tanpa UAC, domain, kelompok transitif, apa pun - karena menggunakan cara yang sama seperti sistem itu sendiri ketika itu memeriksa perizinan. chkadminmencetak "Admin" atau "Non-admin" dan menetapkan kode keluar masing-masing ke 0 atau 1. Outputnya bisa ditekan dengan /qswitch.

chkadmin.c:

#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib,"Advapi32.lib")

int main(int argc, char** argv) {
    BOOL quiet = FALSE;
    DWORD cbSid = SECURITY_MAX_SID_SIZE;
    PSID pSid = _alloca(cbSid);
    BOOL isAdmin;

    if (argc > 1) {
        if (!strcmp(argv[1],"/q")) quiet=TRUE;
        else if (!strcmp(argv[1],"/?")) {fprintf(stderr,"Usage: %s [/q]\n",argv[0]);return 0;}
    }

    if (!CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,pSid,&cbSid)) {
        fprintf(stderr,"CreateWellKnownSid: error %d\n",GetLastError());exit(-1);}

    if (!CheckTokenMembership(NULL,pSid,&isAdmin)) {
        fprintf(stderr,"CheckTokenMembership: error %d\n",GetLastError());exit(-1);}

    if (!quiet) puts(isAdmin ? "Admin" : "Non-admin");
    return !isAdmin;
}

Untuk mengkompilasi, jalankan di command prompt Windows SDK:

cl /Ox chkadmin.c

(jika menggunakan VS2012 +, lebih banyak penyesuaian diperlukan jika Anda perlu menargetkan 2k / XP )


Metode ini milik /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908

1 MSDN mengklaim API adalah XP + tetapi ini salah. CheckTokenMembership 2k + dan yang lainnya bahkan lebih tua .

ivan_pozdeev
sumber
3

Cara terbersih untuk memeriksa hak admin menggunakan skrip CMD, yang saya temukan, adalah seperti ini:

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

Metode ini hanya menggunakan built-in CMD.exe, jadi harus sangat cepat. Ini juga memeriksa kemampuan proses yang sebenarnya daripada memeriksa SID atau keanggotaan grup, sehingga izin efektif diuji. Dan ini bekerja sejauh Windows 2003 dan XP. Proses pengguna normal atau proses yang tidak terkait gagal penyelidikan direktori, di mana Admin atau proses yang ditingkatkan berhasil.

Tes ini gagal jika Everyone, BUILTIN\Users, kelompok yang sama atau lainnya diberikan izin baca untuk systemprofile. Memang, itu adalah konfigurasi non-standar selain pada mesin yang dikonfigurasikan sebagai pengontrol domain Windows yang memberikan hak baca / jalankan AUTHORITY NT \ Authorisity Users 'untuk systemprofile.

William
sumber
> verifikasi VERIFY tidak aktif. > verifikasi /? Memberitahu cmd.exe apakah akan memverifikasi bahwa file Anda ditulis dengan benar ke disk. VERIFIKASI [HIDUP | OFF] Ketik VERIFY tanpa parameter untuk menampilkan pengaturan VERIFY saat ini. Bagaimana perintah ini membantu skrip?
Luke Kanada REINSTATE MONICA
3
@Canadian Luke, Beberapa perintah perintah bawaan tidak menghapus tingkat kesalahan jika tidak ada kesalahan. Dengan demikian, orang terbiasa membersihkan errorlevel menggunakan hacks seperti verify. Saya cenderung menggunakan cd .(cd space dot) yang menetapkan errorlevel ke 0, tidak menghasilkan output, dan juga berguna untuk membuat file dengan panjang nol cd . >somefile. Yang mengatakan, saya menguji 'dir' pada Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8, dan 10. Untuk semua 'dir' itu akan menghapus errorlevel ke 0 pada keberhasilan jika telah ditetapkan sebelum 'dir'. Jadi saya tidak yakin mengapa william menggunakan 'verifikasi' untuk menghapus kesalahan tingkat pertama.
user3347790