CMD'nin Yönetici olarak çalışıp çalışmadığını / yükseltilmiş ayrıcalıklara sahip olup olmadığını nasıl tespit edebilirim?


101

Bir toplu iş dosyasının içinden, Yönetici / yükseltilmiş ayrıcalıklarla çalışıp çalışmadığımı test etmek istiyorum.

"Yönetici Olarak Çalıştır" seçildiğinde kullanıcı adı değişmez, dolayısıyla bu işe yaramaz.

Evrensel olarak kullanılabilen, etkisi olmayan ancak yönetici ayrıcalıkları gerektiren bir komut varsa, o zaman bunu çalıştırabilir ve ayrıcalıkları test etmek için bir hata kodu kontrol edebilirim. Şimdiye kadar böyle bir komut bulamadım. Bulduğum komutlar, herhangi bir şeyi belirtebilecek tek, spesifik olmayan bir hata kodu döndürüyor gibi görünüyor ve çeşitli nedenlerden dolayı başarısız olmaya meyilliler.

Yalnızca Windows 7'yi önemsiyorum, ancak önceki işletim sistemlerini desteklemek güzel olurdu.


echo > somefileYönetici ayrıcalıkları gerektiren bir dizine bir hack denemek ve yapmak olacaktır. yan etki olarak bir dosya üretir, ancak çarpışmaları kontrol edebilir ve geçici çözüm olarak benzersiz bir dosya adı oluşturabilirsiniz.
Marc B


1
[burada kendi kendine yükselen bir grup bulabilirsiniz] [1] [1]: stackoverflow.com/questions/4051883/…
Amr Ali


1
@npocmaka bağladığınız soru aslında bunun kopyası;) (2013 vs. 2011)
Matthieu

Yanıtlar:


62

EK : Windows 8 için bu çalışmayacaktır; bkz bu mükemmel cevap yerine.


Bu çözümü burada buldum: 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
)

Bunun işe yaramadığını varsayarsak ve Win7'den bahsettiğimizden, uygunsa, Powershell'de aşağıdakileri kullanabilirsiniz:

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

Değilse (ve muhtemelen toplu iş dosyalarını açıkça önerdiğiniz için), yukarıdakileri .NET'te yazabilir ve toplu iş dosyanızın kullanacağı sonuca göre bir exe'den bir çıkış kodu döndürebilirsiniz.


4
AT komutu mükemmel! Sizin Google-fu'nuz Google-fu'mdan daha üstün. ;-)
Jeff

2
+1 @Rushyo, çözümünüzü biraz genişlettim ve ilk karşılaştığım çözüm olduğu için burada yayınladım. Teşekkürler! stackoverflow.com/questions/4051883/…
blak3r

16
ATWindows 8'de çalışmıyor, ancak daha iyi bir çözüm buldum. Bunu başka bir soruya cevap olarak burada yayınladım: stackoverflow.com/questions/4051883/… .
mythofechelon

4
Whoami / grupları tavsiye ederim | findstr / b BUILTIN \ Admin | findstr / c: "Etkin grup" && echo "Bir yöneticim var!" - 95, 98, 2000, xp, vista, 7, 8 üzerinde çalışın! ("Rushyo'nun AT ... kullanma önerisini beğendim"
yorumundan

1
pingEksik sleep
olanı

96

Bu numara yalnızca bir komut gerektirir: net sessionkomut istemine yazın.

Eğer varsa bir yönetici DEĞİL , bir erişim mesajı engellendi olsun.

System error 5 has occurred.

Access is denied.

Eğer varsa bir yönetici ARE , farklı bir mesaj, en yaygın varlık olsun:

There are no entries in the list.

Gönderen MS Technet'te :

Parametreler olmadan kullanıldığında, net session yerel bilgisayardaki tüm oturumlar hakkında bilgi görüntüler.


Bu, AT komutunu kullanan Rushyo'nun cevabıyla işlevsel olarak aynıdır.
Jeff

12
Windows 8.1'de, AT kullanımdan kaldırıldığı için AT'ye tercih edilir. Rushyo yanıtını kullanılarak fakat AT ile net oturumu veya net.exe oturumu benim için mükemmel çalışıyor.
kayleeFrye_onDeck

Bu, bunu komut isteminde yapmanın en kolay yolu gibi görünüyor (yine de toplu iş dosyasından farklıdır).
enderland

2
Yalnızca There are no entries in the list.Windows 10 Pro'da yazdırılıyor
gman

1
toplu iş dosyasında net session >nul 2>&1 || (echo not admin&goto :eof)
şuna

27

Rushyo'nun AT kullanma önerisini beğeniyorum, ancak bu başka bir seçenek:

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

Bu yaklaşım, isterseniz yönetici olmayan ve yükseltilmemiş yönetici arasında ayrım yapmanıza da olanak tanır. Yükseltilmemiş yöneticilerin grup listesinde hala BUILTIN \ Administrators bulunur, ancak bu etkin değildir.

Ancak bu, İngilizce olmayan bazı dil sistemlerinde çalışmayacaktır. Bunun yerine deneyin

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

(Bu, Windows 7'de çalışmalıdır, ancak önceki sürümlerden emin değilim.)


1
Lehçe sürümde, var: BUILTIN \ Administratorzy, bu yüzden tavsiye ederim: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Etkin grup" && goto: isadministrator
barwnikk

@barwnikk, whoami/groupssatırları manuel olarak taramanızı tavsiye ederim . Çok uzun sürmez ve komut beyninize sığar.
Pacerier

@Pacerier: Sorunun amacı , bir toplu iş dosyasındaki yüksekliği tespit etmektir . Bir kişi komut satırındaysa, tek yapması gereken pencere başlığına bakmaktır; bu, yükseltilmişseniz her zaman "Yönetici:" yi başlatır.
Harry Johnston

@HarryJohnston, Wow bunu anlamadı. Tüm Windows sürümleri için "Yönetici" başlığı görünüyor mu?
Pacerier

@Pacerier: tüm güncel sürümler (Vista'dan itibaren).
Harry Johnston

24

Başkalarının daha önce koyduğu gibi, ancak bir toplu komutun başlangıcına konulabilen tek bir satır olarak. (Genellikle @echo kapandıktan sonra.)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)

2
Bu güncel sürümdür ve ilgisiz çıktıyı net.exe'den güzelce gizler
andersand

2
Windows 10'da iyi çalışıyor
James Pack

Harika çalıştı, sadece sonda & Timeout / t 10 & Exit / b 1) olarak ayarlandı, böylece bir toplu iş dosyasında pencere anında kaybolmaz.
WhoIsRich

12

Vista, Win 7 ve üzeri sürümlerde bunu yapmanın en kolay yolu, simge gruplarını numaralandırmak ve geçerli bütünlük düzeyini aramaktır (veya yalnızca grup üyeliği önemliyse yöneticiler sid):

Yükseltilmiş durumda olup olmadığımızı kontrol edin:

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

Yerel yöneticilere ait olup olmadığımızı kontrol edin:

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

Etki alanı yöneticilerine ait olup olmadığımızı kontrol edin:

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

Aşağıdaki makale, pencerelerin kullandığı bütünlük düzeyindeki SID'leri listeler: http://msdn.microsoft.com/en-us/library/bb625963.aspx


whoami / groups, yanlış bilgileri aldığınız bir uç duruma sahiptir. Bkz stackoverflow.com/questions/4051883/...
zumalifeguard

7

İşte Harry'nin yüksek statüye odaklanan cevabının ufak bir değişikliği; Bunu bir install.bat dosyasının başında kullanıyorum:

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
)

Bu kesinlikle benim için çalıştı ve prensip sağlam görünüyor; dan MSFT Chris Jackson :

Yükseltilmiş çalıştırdığınızda, belirteciniz Zorunlu Etiket \ Yüksek Zorunlu Düzey adlı bir ACE içerir.


whoami / groups, yanlış bilgileri aldığınız bir uç duruma sahiptir. Bkz stackoverflow.com/questions/4051883/...
zumalifeguard

7

çözüm:

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

Windows 10 altında çalışmıyor

Windows'un tüm sürümleri için şunları yapabilirsiniz:

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

6

Yanıtların çoğunu (çoğunu?) Okudum, ardından Win 8.1'de benim için çalışan bir yarasa dosyası geliştirdim. Paylaşacağımı düşündüm.

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

Umarım birisi bunu faydalı bulur :)


whoami / groups, yanlış bilgileri aldığınız bir uç duruma sahiptir. Bkz stackoverflow.com/questions/4051883/...
zumalifeguard

Bunun için teşekkür ederim! Diğer "whoami" çözümü Windows 8.1'de benim için işe yaramadı. Bu yaptı.
Ryan


1

Bu partiye gerçekten geç kaldığımı biliyorum, ama işte yöneticiyi belirlemek için tek astarım.

Hata düzeyine bağlı değildir, sadece şunlara bağlıdır 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%)

Kullanıcının yönetici durumuna bağlı olarak evet veya hayır döndürür ...

Ayrıca "admin" değişkeninin değerini de buna göre evet veya hayır olarak ayarlar.


Bu, yalnızca kullanıcı Yöneticiler yerel grubunun doğrudan bir üyesi ise işe yarar. Kullanıcı, Yöneticiler grubunun bir üyesi olan bir etki alanı grubunun (örneğin, "Etki Alanı Yöneticileri") üyesiyse, çalışmaz.
Harry Johnston

1

Yönetici haklarına sahip bir kullanıcı olarak çalıştırıyorsanız, ortam değişkeni SessionName tanımlanmaz ve bir toplu iş dosyasını çalıştırırken yönetici haklarına sahip olmazsınız.

Yönetici haklarını doğrulamak için "net session" komutunu kullanmalı ve "0" hata dönüş kodunu aramalısınız.

Misal; - ilk yankı ifadesi çan karakteridir 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)


0

İşte Windows 7'den Windows 10'a kadar kullandığım basit bir yöntem. Temel olarak, Windows \ System32 \ WDI \ LogFiles klasörünü kontrol etmek için "IF EXIST" komutunu kullanıyorum. WDI klasörü, en az 7'den itibaren her Windows yüklemesinde bulunur ve erişim için yönetici ayrıcalıkları gerektirir. WDI klasörünün içinde her zaman bir LogFiles klasörü bulunur. Bu nedenle, WDI \ LogFiles klasöründe "IF EXIST" çalıştırıldığında, yönetici olarak çalıştırılırsa doğru, yönetici olarak çalıştırılmazsa yanlış döndürülür. Bu, ayrıcalık düzeyini kontrol etmek için bir toplu iş dosyasında kullanılabilir ve o sonuca bağlı olarak istediğiniz komutlara dallanabilir.

İşte örnek kodun kısa bir pasajı:

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

:GOTADMIN
(Commands for running with admin privileges)

Bu yöntemin, varsayılan güvenlik izinlerinin WDI klasöründe değiştirilmediğini varsaydığını unutmayın (bu çoğu durumda gerçekleşmesi olası değildir, ancak lütfen aşağıdaki 2 numaralı uyarıya bakın). Bu durumda bile, yönetici erişimi gerektiren farklı bir ortak dosya / klasörü kontrol etmek için kodu değiştirme meselesi (System32 \ config \ SAM iyi bir alternatif aday olabilir) veya bunun için özel olarak kendinizinkini bile oluşturabilirsiniz. amaç.

Yine de bu yöntemle ilgili iki uyarı var:

  1. UAC'yi devre dışı bırakmak, muhtemelen her şeyin yine de yönetici olarak çalıştırılacağı gerçeğini ortadan kaldıracaktır.

  2. WDI klasörünü Windows Gezgini'nde açmaya çalışmak ve ardından sorulduğunda "Devam" ı tıklamak, o kullanıcı hesabı için kalıcı erişim hakları ekleyerek yöntemimi bozar. Bu olursa, kullanıcı hesabını WDI klasörü güvenlik izinlerinden kaldırarak düzeltilebilir. Herhangi bir nedenle kullanıcının Windows Gezgini ile WDI klasörüne erişebilmesi ZORUNLUysa, farklı bir klasörü kontrol etmek için kodu değiştirmeniz gerekir (yukarıda belirtildiği gibi, bu amaç için özel olarak kendi klasörünüzü oluşturmak iyi bir seçim olabilir) .

Kuşkusuz, yöntemim kırılabileceği için mükemmel değil, ancak uygulaması kolay, nispeten hızlı bir yöntem, Windows 7, 8 ve 10'un tüm sürümleriyle eşit derecede uyumlu ve belirtilen uyarılara dikkat etmem şartıyla benim için% 100 etkili oldu.


0

Win7 Enterprise ve Win10 Enterprise için çalışır

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.