Bagaimana cara saya memeriksa apakah skrip batch saat ini memiliki hak admin?
Saya tahu cara membuatnya menyebut dirinya dengan runas tetapi tidak bagaimana memeriksa hak admin. Satu-satunya solusi yang saya lihat adalah pekerjaan peretasan kasar atau menggunakan program eksternal. Yah, sebenarnya saya tidak peduli jika ini adalah pekerjaan hack selama itu bekerja pada Windows XP dan yang lebih baru.
windows
batch-file
cmd
admin
flacs
sumber
sumber
Jawaban:
Masalah
Solusi blak3r / Rushyo bekerja dengan baik untuk semuanya kecuali Windows 8. Menjalankan
AT
pada Windows 8 menghasilkan:(lihat tangkapan layar # 1) dan akan kembali
%errorLevel%
1
.Penelitian
Jadi, saya pergi mencari perintah lain yang memerlukan izin tinggi. rATIONALparanoid.com memiliki daftar beberapa, jadi saya menjalankan setiap perintah pada dua ekstrim yang berlawanan dari OS Windows saat ini (XP dan 8) dengan harapan menemukan perintah yang akan ditolak akses pada kedua OS ketika dijalankan dengan izin standar.
Akhirnya, saya menemukan satu -
NET SESSION
. Sebuah benar , bersih, solusi universal yang tidak melibatkan:FOR
loopAT
(Windows 8 tidak kompatibel) atauWHOAMI
(Windows XP tidak kompatibel).Masing-masing memiliki masalah keamanan, kegunaan, dan portabilitas sendiri.
Pengujian
Saya telah mengkonfirmasi secara independen bahwa ini berfungsi pada:
(lihat tangkapan layar # 2)
Implementasi / Penggunaan
Jadi, untuk menggunakan solusi ini, cukup lakukan sesuatu seperti ini:
Tersedia di sini, jika Anda malas: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat
Penjelasan
NET SESSION
adalah perintah standar yang digunakan untuk "mengelola koneksi komputer server. Digunakan tanpa parameter, [itu] menampilkan informasi tentang semua sesi dengan komputer lokal."Jadi, inilah proses dasar implementasi yang saya berikan:
@echo off
goto check_Permissions
:check_Permissions
blok kodenet session >nul 2>&1
STDOUT
) kenul
STDERR
) ke tujuan yang sama dengan gagang numerik 1if %errorLevel% == 0
%errorLevel%
) adalah0
maka ini berarti bahwa tidak ada kesalahan telah terjadi dan, oleh karena itu, perintah sebelumnya langsung berjalan dengan sukseselse
%errorLevel%
) tidak0
maka ini berarti bahwa kesalahan telah terjadi dan, oleh karena itu, perintah sebelumnya langsung berjalan tidak berhasilTangkapan layar
Windows 8
AT
%errorLevel%
:NET SESSION
pada Windows XP x86 - Windows 8 x64 :Terima kasih, @Tilka, karena mengubah jawaban Anda yang diterima menjadi milik saya. :)
sumber
net session
sukses (ERRORLEVEL = 0) - tetapi mereka tidak benar-benar memiliki hak admin. Menggunakanopenfiles
(lihat jawaban oleh Lucretius di bawah) tidak memiliki masalah ini.Solusi Anders bekerja untuk saya, tetapi saya tidak yakin bagaimana cara membalikkannya untuk mendapatkan yang sebaliknya (ketika Anda bukan admin).
Inilah solusi saya. Ini memiliki dua kasus, kasus IF dan ELSE, dan beberapa ascii seni untuk memastikan orang benar-benar membacanya. :)
Versi Minimal
Rushyo memposting solusi ini di sini: Bagaimana mendeteksi jika CMD berjalan sebagai Administrator / telah meningkatkan hak istimewa?
Versi yang menambahkan Pesan Kesalahan, Jeda, dan Keluar
Bekerja pada WinXP -> Win8 (termasuk versi 32/64 bit).
EDIT: 8/28/2012 Diperbarui untuk mendukung Windows 8. @BenHooper menunjukkan ini dalam jawabannya di bawah. Harap jawab jawabannya.
sumber
AT
tidak berfungsi pada Windows 8, tetapi saya telah menemukan solusi yang lebih baik. Saya telah mempostingnya sebagai jawaban di sini, sebenarnya: stackoverflow.com/questions/4051883/… (atau Anda bisa gulir ke bawah, apa pun).Lebih banyak masalah
Seperti yang ditunjukkan oleh @Lectrode, jika Anda mencoba menjalankan
net session
perintah ketika layanan Server dihentikan, Anda menerima pesan galat berikut:Dalam hal ini
%errorLevel%
variabel akan diatur ke2
.Catatan Layanan Server tidak dimulai saat dalam Mode Aman (dengan atau tanpa jaringan).
Mencari alternatif
Sesuatu yang:
Jadi saya mem-boot mesin virtual vanilla Windows XP dan saya mulai menggulir daftar aplikasi dalam
C:\Windows\System32
folder, mencoba untuk mendapatkan beberapa ide. Setelah cobaan dan kesalahan, ini adalah pendekatan kotor (pun intended) yang saya buat dengan:The
fsutil dirty
perintah membutuhkan hak admin untuk menjalankan, dan akan gagal sebaliknya.%systemdrive%
adalah variabel lingkungan yang mengembalikan huruf drive tempat sistem operasi diinstal. Output diarahkan kenul
, sehingga diabaikan. The%errorlevel%
variabel akan ditetapkan ke0
hanya setelah eksekusi sukses.Inilah yang dikatakan dalam dokumentasi:
Penelitian lebih lanjut
Sementara solusi di atas bekerja dari Windows XP dan seterusnya, ada baiknya menambahkan bahwa Windows 2000 dan Windows PE (Preinstalled Environment) tidak disertai
fsutil.exe
, jadi kita harus menggunakan yang lain.Selama pengujian saya sebelumnya, saya perhatikan bahwa menjalankan
sfc
perintah tanpa parameter apa pun akan menghasilkan:Yaitu: tidak ada parameter, tidak ada pihak . Idenya adalah bahwa kita dapat mem-parsing output dan memeriksa apakah kita mendapatkan kesalahan:
Output kesalahan pertama-tama diarahkan ke output standar, yang kemudian disalurkan ke
find
perintah. Pada titik ini kita harus mencari -satunya parameter yang didukung di semua versi Windows yang sejak Windows 2000:/SCANNOW
. Pencarian tidak peka huruf besar kecil, dan hasilnya dibuang dengan mengarahkannya kenul
.Berikut kutipan dari dokumentasi:
Contoh Penggunaan
Berikut ini beberapa contoh tempel dan jalankan:
Windows XP dan yang lebih baru
Windows 2000 / Windows PE
Berlaku untuk
---
sumber
SFC
cek untuk semua sistem, Anda harus sedikit kreatif. Untuk beberapa alasan, mulai dengan Windows 8 hanyaSFC
menghasilkan karakter tunggal. Agar berhasil mengurai output, Anda perlu melakukan hal berikut:setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%s in ('sfc 2^>^&1^|MORE') do @set "output=!output!%%s"
echo "%output%"|findstr /I /C:"/scannow">nul 2>&1
(3 baris terpisah). Ini harus bekerja pada Windows 2000 melalui Windows 2012 R2. Di samping catatan, saya lebih suka FINDSTR karena umumnya memproses hal-hal lebih cepat daripada FIND.fsutil
solusi Anda secara pribadi , tetapi, dari apa yang saya lihat, tampaknya jauh lebih fleksibel daripada solusi saya. Meskipun, tidak seanggun itu, mungkin. ;) Saya senang melihat bahwa, di antara kami, kami mendapatkan solusi pendeteksi admin yang luar biasa, mudah, dan fleksibel. :)fsutil dirty query >nul
ketika ditinggikan ini mengembalikan beberapa teks bantuan dan% errorlevel% = 0fsutil dirty query >nul
, namunfsutil dirty query %systemdrive% >nul
masih berfungsidua cara lagi - kompatibel cepat dan mundur.
fltmc
perintah tersedia di setiap sistem windows sejak XP jadi ini seharusnya cukup portabel.Salah satu solusi yang lebih sangat cepat diuji pada
XP
,8.1
,7
- ada satu variabel tertentu=::
yang disajikan hanya jika sesi konsol tidak memiliki privileges.As admin itu tidak begitu mudah untuk membuat variabel yang berisi=
nama itu ini adalah cara yang relatif dapat diandalkan untuk memeriksa admin izin (tidak memanggil executable eksternal sehingga berkinerja baik)Jika Anda ingin menggunakan ini langsung melalui baris perintah, tetapi bukan dari file batch Anda dapat menggunakan:
sumber
=::
variabel agak bug - itu mewakili drive yang tidak ada, jadi mungkin itu diperbaiki di win10.=::
didefinisikan untuk non admin CMD pada windows 10 1709. Pokoknya itu bukan cara yang dapat diandalkan, Anda dapat dengan mudah memaksanya untuk didefinisikan bahkan pada sesi admin CMD:subst :: c:\ & for %a in (::) do %a & set,
sumber
solusi alternatif:
sumber
openfiles
dan memeriksa ERRORLEVEL sudah cukup.openfiles.exe
tidak berfungsi di WinPE, jadi skrip akan selalu mengembalikan bahwa pengguna bukan admin.1>
dan2>&1
dijelaskan di microsoft.com/resources/documentation/windows/xp/all/proddocs/… .nul
merujuk ke perangkat nolTidak hanya memeriksa tetapi MENDAPATKAN hak admin secara otomatis
alias UAC Otomatis untuk Win 7/8 / 8.1 ff. : Berikut ini adalah yang sangat keren dengan satu fitur lagi: Cuplikan batch ini tidak hanya memeriksa hak admin, tetapi juga mendapatkannya secara otomatis! (dan tes sebelumnya, jika hidup pada OS yang mampu UAC.)
Dengan trik ini Anda tidak perlu lagi mengklik kanan pada file batch Anda "dengan hak admin". Jika Anda lupa, untuk memulainya dengan hak tinggi, UAC muncul secara otomatis! Selain itu, pada awalnya diuji, jika OS membutuhkan / menyediakan UAC, sehingga berperilaku benar misalnya untuk Win 2000 / XP hingga Win 8.1 diuji.
Cuplikan menggabungkan beberapa pola batch yang baik bersama-sama, terutama (1) tes admin di utas ini oleh Ben Hooper dan (2) aktivasi UAC membaca di BatchGotAdmin dan dikutip di situs batch oleh robvanderwoude (hormat). (3) Untuk identifikasi OS dengan "pola VER | FINDSTR" Saya tidak menemukan referensi.)
(Mengenai beberapa pembatasan yang sangat kecil, ketika "NET SESSION" tidak berfungsi seperti yang disebutkan dalam jawaban lain - jangan ragu untuk memasukkan perintah-perintah lain. Bagi saya yang menjalankan dalam mode aman Windows atau layanan standar khusus turun dan semacam itu bukan kasus penggunaan yang penting - untuk beberapa admin mungkin mereka.)
sumber
start
- itu membuka skrip di jendela baru. Jika Anda ingin melihat hasilnya - tambahkanpause
di akhir skrip Anda. Juga, sulit dideteksi, ketika kita "tetap" meningkat, dan ketika ada tayangan ulang. Anda dapat menggunakan argumen baris perintah untuk itu: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…Saya memiliki dua cara untuk memeriksa akses istimewa, keduanya cukup dapat diandalkan, dan sangat portabel di hampir setiap versi windows.
1. Metode
* Bekerja pada XP dan yang lebih baru
2. Metode
* Bekerja pada XP dan yang lebih baru
Contoh kerja
Script yang menghapus folder temp
Tampilkan cuplikan kode
sumber
Dalam skrip batch Tinggikan.cmd (lihat tautan ini ), yang telah saya tulis untuk mendapatkan hak admin , saya telah melakukannya dengan cara berikut:
Ini adalah diuji untuk Windows 7, 8, 8.1, 10 dan bahkan Windows XP dan tidak memerlukan sumber daya apa pun seperti direktori khusus, file, atau kunci registri.
sumber
Cara terbersih untuk memeriksa hak admin menggunakan skrip CMD, yang saya temukan, adalah seperti ini:
Metode ini hanya menggunakan bawaan 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.
sumber
Berikut ini mencoba membuat file di direktori Windows. Jika berhasil maka akan menghapusnya.
Perhatikan bahwa 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 adalah GUID yang dibuat hari ini dan diasumsikan tidak mungkin bertentangan dengan nama file yang ada.
sumber
was generated today and it is assumed to be improbable to conflict with an existing filename.
kecuali jika dua orang menggunakan kode iniWhoami / grup tidak berfungsi dalam satu kasus. Jika UAC Anda benar-benar dimatikan (tidak hanya notifikasi dimatikan), dan Anda memulai dari prompt Administrator kemudian mengeluarkan:
Anda akan menjalankan non-tinggi, tetapi mengeluarkan:
akan mengatakan Anda terangkat. Itu salah. Inilah mengapa itu salah:
Saat menjalankan dalam kondisi ini, jika IsUserAdmin ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389(v=vs.85).aspx ) mengembalikan FALSE dan UAC dinonaktifkan sepenuhnya, dan GetTokenInformation mengembalikan TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx ) maka proses tidak berjalan tinggi, tetapi
whoami /groups
mengklaim itu.sungguh, cara terbaik untuk melakukan ini dari file batch adalah:
Anda harus melakukan
net session
dua kali karena jika seseorang melakukanat
sebelumnya, Anda akan mendapatkan informasi yang salah.sumber
whoami /groups
tidak memberikan informasi yang salah. Hanya sajarunas /trustlevel
menempatkan Anda di tempat yang tidak terduga: berjalan tanpa hak administrator tetapi dengan tingkat integritas tinggi. Anda dapat mengkonfirmasi ini dengan Process Explorer. (Ini mungkin bug dirunas
tetapi bukan bug diwhoami
.)runas /trustlevel
Ketika Anda adalah admin lokal, dan UAC dinonaktifkan, mengeluarkan perintah runas dari prompt admin akan menempatkan Anda ke dalam konteks keamanan "pengguna dasar". Saat dalam mode itu, Anda tidak dapat melakukan operasi admin. Coba "sesi bersih", atau fsutil "atau utilitas lain apa pun yang memerlukan akses administrator. Namun," whoami / grup "memberi tahu Anda bahwa Anda ditinggikan. Ketika tidak. Fakta bahwa memanggil GetTokenInformation mengembalikan" TokenElevationTypeDefault "yang menunjukkan hal itu.sumber
whoami
tidak didukung di Windows XP.Beberapa server menonaktifkan layanan yang dibutuhkan oleh perintah "sesi bersih". Ini menghasilkan cek admin selalu mengatakan Anda tidak memiliki hak admin ketika Anda mungkin memiliki.
sumber
Sunting: copyitright telah menunjukkan bahwa ini tidak dapat diandalkan. Menyetujui akses baca dengan UAC akan memungkinkan dir berhasil. Saya memiliki sedikit lebih banyak skrip untuk menawarkan kemungkinan lain, tetapi itu bukan hanya baca.
Jawaban lama di bawah
Peringatan: tidak bisa diandalkan
Berdasarkan sejumlah jawaban baik lainnya di sini dan poin yang diajukan oleh and31415 saya menemukan bahwa saya penggemar berikut ini:
Sedikit ketergantungan dan cepat.
sumber
Catatan: Memeriksa dengan cacl untuk sistem \ system32 \ config \ akan SELALU gagal di WOW64, (misalnya dari% systemroot% \ syswow64 \ cmd.exe / 32 bit Total Commander) sehingga skrip yang berjalan dalam shell 32bit dalam sistem 64bit akan berulang selamanya ... Lebih baik memeriksa hak pada direktori Prefetch:
Menang XP ke 7 diuji, namun gagal di WinPE seperti pada windows 7 install.wim tidak ada dir atau cacls.exe
Juga di winPE DAN wow64 gagal memeriksa dengan openfiles.exe:
Di Windows 7 akan muncul kesalahan tingkat dengan "1" dengan info bahwa "Sistem target harus sistem operasi 32bit"
Kedua pemeriksaan mungkin juga akan gagal di konsol pemulihan.
Apa yang bekerja di Windows XP - 8 32/64 bit, di WOW64 dan di WinPE adalah: tes pembuatan dir (JIKA admin tidak membombardir direktori Windows dengan izin untuk semua orang ...) dan
dan
memeriksa.
Juga satu catatan lagi di beberapa windows XP (dan versi lain mungkin juga, tergantung pada bermain-main admin) tergantung pada entri registri langsung memanggil bat / cmd dari skrip .vbs akan gagal dengan info bahwa file bat / cmd tidak terkait dengan apa pun ...
Memanggil cmd.exe dengan parameter file bat / cmd di sisi lain berfungsi OK:
sumber
Secara harfiah lusinan jawaban dalam hal ini dan pertanyaan terkait serta di tempat lain di SE, yang semuanya kekurangan dalam hal ini atau lainnya, telah dengan jelas menunjukkan bahwa Windows tidak menyediakan utilitas konsol bawaan yang andal. Jadi, sekarang saatnya untuk meluncurkan milik Anda sendiri.
Berikut kode C, berdasarkan Mendeteksi jika program ini berjalan dengan hak administrator penuh , bekerja di Win2k + 1 , di mana saja dan dalam semua kasus (UAC, domain, kelompok transitif ...) - karena tidak sama dengan sistem itu sendiri ketika memeriksa izin. Ini menandakan hasil baik dengan pesan (yang dapat dibungkam dengan sakelar) dan kode keluar.
Itu hanya perlu dikompilasi sekali, maka Anda bisa menyalin di
.exe
mana - mana - hanya tergantung padakernel32.dll
danadvapi32.dll
(saya sudah mengunggah salinan ).chkadmin.c
:1 MSDN mengklaim API adalah XP + tetapi ini salah.
CheckTokenMembership
2k + dan yang lainnya bahkan lebih tua . Tautan terakhir juga berisi cara yang jauh lebih rumit yang akan berfungsi bahkan di NT.sumber
PowerShell siapa saja?
sumber
Berikut ini satu lagi untuk ditambahkan ke daftar ;-)
(mencoba membuat file di lokasi sistem)
The
MODE CON
menginisialisasi ulang layar dan mengesampingkan semua teks / kesalahan ketika tidak memiliki izin untuk menulis ke lokasi sistem.sumber
Alternatif: Gunakan utilitas eksternal yang dirancang untuk tujuan ini, misalnya, IsAdmin.exe (freeware tidak terbatas).
Kode keluar:
0 - Pengguna saat ini bukan anggota grup Administrators
1 - Anggota pengguna saat ini dari Administrator dan menjalankan ditinggikan
2 - Anggota pengguna saat ini dari Administrator, tetapi tidak menjalankan ditinggikan
sumber
sumber
Saya akan menjelaskan kode baris demi baris:
Pengguna akan terganggu dengan lebih dari 1 baris tanpa ini.
Titik di mana program dimulai.
Atur nama file direktori yang akan dibuat.
Membuat direktori aktif
<DL>:\Windows
(ganti <DL> dengan huruf drive).Jika variabel lingkungan ERRORLEVEL adalah nol, maka pesan keberhasilan echo.
Pergi ke akhir (jangan melanjutkan lebih jauh).
Jika ERRORLEVEL adalah satu, gema pesan kegagalan dan pergi ke akhir.
Jika nama file sudah ada, buat ulang folder (jika tidak,
goto end
perintah tidak akan membiarkan ini berjalan).Tentukan titik akhir
Hapus direktori yang dibuat.
Jeda agar pengguna dapat melihat pesan.
Catatan : The
>nul
dan2>nul
sedang memfilter output dari perintah ini.sumber
net user %username% >nul 2>&1 && echo admin || echo not admin
sumber
admin
Saya pikir cara paling sederhana adalah mencoba mengubah tanggal sistem (yang memerlukan hak admin):
Jika
%date%
variabel dapat menyertakan hari dalam seminggu, dapatkan saja tanggal dari bagian terakhir dariDATE
perintah:sumber
:(
Saya menemukan pengguna yang dapat digunakan
net session
meskipun mereka bukan admin. Saya tidak melihat mengapa. Solusi saya adalah untuk menguji apakah pengguna dapat membuat folder di folder windows.Ini kode saya:
sumber
Kumpulan empat metode yang tampaknya paling kompatibel dari halaman ini. Yang pertama sangat jenius. Diuji dari XP ke atas. Meskipun membingungkan bahwa tidak ada perintah standar yang tersedia untuk memeriksa hak admin. Saya kira mereka hanya berfokus pada PowerShell sekarang, yang benar-benar tidak berguna untuk sebagian besar pekerjaan saya sendiri.
Saya menelepon batch 'exit-if-not-admin.cmd' yang dapat dipanggil dari batch lain untuk memastikan mereka tidak melanjutkan eksekusi jika hak admin yang diperlukan tidak diberikan.
sumber
Inilah nilai 2-sen saya:
Saya membutuhkan batch untuk dijalankan dalam lingkungan Domain selama proses login pengguna, dalam lingkungan 'ruang kerja', melihat pengguna mematuhi kebijakan "penguncian" dan tampilan terbatas (terutama didistribusikan melalui set GPO).
Set Domain GPO diterapkan sebelum skrip login yang terhubung dengan pengguna AD Membuat skrip login GPO terlalu matang karena profil "baru" pengguna belum dibuat / dimuat / atau siap untuk menerapkan "hapus dan / atau Sematkan "bilah tugas dan item Menu Mulai vbscript + tambahkan beberapa file lokal.
misalnya: Lingkungan profil 'pengguna-pengguna' yang diusulkan memerlukan pintasan ".URL '(.lnk) yang ditempatkan di dalam"% ProgramData% \ Microsoft \ Windows \ Start Menu \ Program * MyNewOWA.url * ", dan" C: \ Users \ Public \ Desktop \ * MyNewOWA.url * "lokasi, di antara item lainnya
Pengguna memiliki beberapa mesin dalam domain, di mana hanya PC 'ruang kerja' yang ditetapkan ini yang memerlukan kebijakan ini.
Folder-folder ini memerlukan hak 'Admin' untuk dimodifikasi, dan meskipun 'Pengguna Domain' adalah bagian dari grup 'Admin' lokal - UAC adalah tantangan berikutnya.
Menemukan berbagai adaptasi dan digabung di sini. Saya memiliki beberapa pengguna dengan perangkat BYOD juga yang membutuhkan file lain dengan masalah perm. Belum diuji pada XP (OS yang sedikit terlalu tua), tetapi kodenya ada, akan senang memberi umpan balik.
Domain PC harus diatur sebanyak mungkin oleh perangkat GPO. Mesin Workgroup / Standalone dapat diatur oleh skrip ini.
Ingat, prompt UAC akan muncul setidaknya sekali dengan BYOD workgroup PC (segera setelah peningkatan pertama ke 'Admin perms' diperlukan), tetapi karena kebijakan keamanan lokal dimodifikasi untuk penggunaan admin mulai saat ini, maka pop-up akan hilang.
Domain PC harus memiliki kebijakan GPO "ConsentPromptBehaviorAdmin" yang diatur dalam kebijakan "Penguncian" yang sudah Anda buat - seperti dijelaskan di bagian skrip 'REFERENSI'.
Sekali lagi, jalankan impor secedit.exe dari file '.inf' default jika Anda terjebak pada keseluruhan debat "To UAC or Not to UAC" :-).
btw: @boileau Periksa kegagalan Anda pada:
Dengan menjalankan hanya "% SYSTEMROOT% \ system32 \ cacls.exe" atau "% SYSTEMROOT% \ system32 \ config \ system" atau keduanya dari prompt perintah - dinaikkan atau tidak, periksa hasilnya di seluruh papan.
sumber
Cara lain untuk melakukan ini.
sumber