Geçerli Komut İstemi'nin Yönetici olarak başlatılıp başlatılmadığını kontrol edin


21

Kullanıcı girişi alan bir komut dosyası yazmak istiyorum, daha sonra sistem genelinde değişiklikler yapar. Bunun çok genel olmasına ihtiyacım var, ama basitçe, en üste, 'Yönetici olarak' çalıştırılıp çalıştırılmadığını kontrol etmem gerekiyor. Eğer değilse, o zaman onlara bunu söyleyen bir mesaj görüntülemek istiyorum; öyleyse, devam etmesini istiyorum. Bunu doğrulamanın sürekli bir yolu var mı? Yönetici olarak yeni bir oturum başlatmak istemiyorum, yalnızca şu anda yönetici olarak çalıştırılıp çalıştırılmadığını tespit etmek istiyorum



@ g-man nasıl ilişkilidir?
Kanadalı Luke MONICA RESTATAT

Ayrıca Yönetici olarak çalıştırılırsa veya çalıştırılmazsa farklı davranacak komutlar ister - veya en azından cevap olarak bunları alır.
G-Man

Yanıtlar:


16

Bunu Stack Overflow'ta buldum :

@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

Silinmesinin nedeni neydi?
Kanadalı Luke MONICA TAKİP ET

Bu yönetici hesabından eserler hem ve ben 'Yönetici olarak çalıştır' sınırlı kullanıcı olarak çalışacak, fakat seçtiğinizde
Kanadalı Luke eski haline MONICA

2
Aynı fikir, ama şartlı yürütme operatörleri kullanarak: net session >nul 2>&1 && echo Success || echo Failure. Bu küçük sözdizimini daha uygun buluyorum.
dbenham

6
Bu, çalışan "Sunucu" hizmeti gerektirir.
ivan_pozdeev

8

Bu, yüksek bütünlük seviyesi için kontrol eder. (Windows Vista ve üstü için çalışır)

@echo off

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

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)

1
whoami xp'de desteklenmiyor, awnser daha iyi, Windows xp'den Windows 8'e kadar tüm işletim sistemlerini destekliyor.
Alex

2
Bu, yalnızca Komut İstemi'ni açarsam çalışır.
CMD'yi

2
Daha fazla işletim sistemi için @Alex Desteği harika, ancak bu yöntem, olumlu sonuç almak için daha az güvenilir bir olumsuzun yokluğunu almak yerine, mevcut oturuma verilen izinleri doğrudan sorguladığı için daha güvenilirdir.
Iszi 10:14

2
hafta, whoami / grupların yanlış bilgi alacağınız bir durumu var. Bkz stackoverflow.com/questions/4051883/...
zumalifeguard

1
@week whoamiXP'de eksik.
ivan_pozdeev

4

Bunların hepsi veya bu şekilde eksik olan SE ( 1 , 2 , 3) 'te verilen birkaç soruya ve daha birçok soruya verilen cevapların çoğu, Windows'un güvenilir bir yerleşik hizmet sağlamadığını açıkça göstermiştir. . Öyleyse, kendi kararınızı vermenin zamanı geldi.

Başka kirli kesmek olmadan:

Aşağıdaki programı derleyin (talimatlar takip edin) veya önceden derlenmiş bir kopya alın . Bunun yalnızca bir kez yapılması gerekir, ardından .exeher yeri kopyalayabilirsiniz (örneğin, Sysinternals Suite ile birlikte ).

Kod, Win2k + 1'de çalışır ( UAC, etki alanı, geçişli gruplar, ne olursa olsun, her ikisi de) - izinleri denetlerken sistemin kendisi ile aynı şekilde kullanılır. chkadmin"Yönetici" veya "Yönetici olmayan" yazar ve çıkış kodunu sırasıyla 0 veya 1 olarak ayarlar. Çıkış, /qanahtarla bastırılabilir .

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;
}

Derlemek için, Windows SDK komut isteminde çalıştırın:

cl /Ox chkadmin.c

(VS2012 + kullanıyorsanız, 2k / XP'yi hedeflemeniz gerekiyorsa daha fazla ayar yapılması gerekir )


Yöntem, /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908'in izniyle

1 MSDN, API’lerin XP + olduğunu iddia ediyor, ancak bu yanlış. CheckTokenMembership 2k + ve diğeri daha da eski .


3

Bulduğum bir CMD komut dosyası kullanarak yönetici ayrıcalıklarını kontrol etmenin en temiz yolu şunun gibi:

@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

Bu yöntem yalnızca CMD.exe yerleşiklerini kullanır, bu nedenle çok hızlı olması gerekir. Ayrıca, SID'leri veya grup üyeliklerini kontrol etmek yerine sürecin gerçek yeteneklerini de kontrol eder, bu nedenle etkili izin test edilir. Ve bu, Windows 2003 ve XP kadar geriye çalışır. Normal kullanıcı işlemleri veya yükseltilmemiş işlemler, Yönetici veya yükseltilmiş işlemler başarılı olduğunda, dizin sondasında başarısız olur.

Bu sınama başarısız Everyone, BUILTIN\Usersya da diğer benzeri grup SystemProfile okuma izni verilir. Verilen, 'NT AUTHORITY \ Authenticated Users' veren, sistem profili için okuma / yürütme hakkı veren, Windows etki alanı denetleyicileri olarak yapılandırılmış makineler dışındaki standart olmayan bir yapılandırmadır.


> VERIFY’nin kapalı olduğunu doğrulayın. > doğrula /? Cmd.exe dosyasına, dosyalarınızın bir diske doğru yazıldığını doğrulayıp doğrulamamasını söyler. VERIFY [AÇIK | OFF] Geçerli VERIFY ayarını görüntülemek için parametre olmadan VERIFY yazın. Bu komut komut dosyasına nasıl yardımcı olur?
Kanadalı Luke MONICA KURULDU

3
@Canadian Luke, Bazı yerleşik komutlar hata yoksa hata seviyesini temizlemez. Böylece, insanlar gibi hackler kullanarak hata seviyesini temizleme alışkanlığı edindiler verify. cd .Hata seviyesini 0 olarak ayarlayan, çıktı üretmeyen ve ayrıca sıfır uzunluklu bir dosya oluşturmak için de kullandığım (cd boşluk noktası) kullanma eğilimindeyim cd . >somefile. Bununla birlikte, Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 ve 10'da 'dir' testini yaptım. Tüm bu 'dir' için, daha önce ayarlanmışsa, hata sırasındaki başarıyı 0 olarak kaldıracak. 'dir'. Bu yüzden, William'ın neden hata seviyesini gidermek için “doğrula” kullandığından emin değilim.
kullanıcı3347790
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.