Skrypt wsadowy: jak sprawdzić uprawnienia administratora

281

Jak sprawdzić, czy bieżący skrypt wsadowy ma uprawnienia administratora?

Wiem, jak wywoływać się za pomocą run, ale nie wiem, jak sprawdzić uprawnienia administratora. Jedyne rozwiązania, które widziałem, to prymitywne hakowanie lub używanie programów zewnętrznych. Właściwie nie dbam o to, czy jest to hackowanie, o ile działa w systemie Windows XP i nowszych.

flacs
źródło
2
po tym, jak możesz zmienić prawo: [Jak poprosić administratora o dostęp do pliku wsadowego] [1] [1]: stackoverflow.com/questions/1894967/…
Alban
Zobacz także: superuser.com/questions/667607/…
ivan_pozdeev,

Odpowiedzi:

466

Zagadnienia

Rozwiązanie blak3r / Rushyo działa dobrze we wszystkim oprócz Windows 8. Uruchomienie ATsystemu Windows 8 powoduje:

The AT command has been deprecated. Please use schtasks.exe instead.

The request is not supported.

(patrz zrzut ekranu nr 1) i wróci %errorLevel% 1.

 

Badania

Poszedłem więc szukać innych poleceń wymagających podwyższonych uprawnień. rationallyparanoid.com miał listę kilku, więc uruchomiłem każdą komendę na dwóch przeciwległych krańcach obecnych systemów operacyjnych Windows (XP i 8) w nadziei na znalezienie polecenia, które odmówiłoby dostępu do obu systemów operacyjnych, gdy uruchomiono je ze standardowymi uprawnieniami.

W końcu znalazłem jeden NET SESSION. Prawdziwe , czyste, uniwersalne rozwiązanie, które nie pociąga za sobą:

  • tworzenie lub interakcja z danymi w bezpiecznych lokalizacjach
  • analizowanie danych zwracanych z FORpętli
  • wyszukiwanie ciągów dla „Administrator”
  • przy użyciu AT(niezgodny z Windows 8) lub WHOAMI(niezgodny z Windows XP).

Każdy z nich ma własne problemy z bezpieczeństwem, użytecznością i przenośnością.

 

Testowanie

Niezależnie potwierdziłem, że działa to na:

  • Windows XP, x86
  • Windows XP, x64
  • Windows Vista, x86
  • Windows Vista, x64
  • Windows 7, x86
  • Windows 7, x64
  • Windows 8, x86
  • Windows 8, x64
  • Windows 10 v1909, x64

(patrz zrzut ekranu # 2)

 

Wdrożenie / wykorzystanie

Aby skorzystać z tego rozwiązania, po prostu zrób coś takiego:

@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

Dostępne tutaj, jeśli jesteś leniwy: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

 

Wyjaśnienie

NET SESSIONto standardowe polecenie używane do „zarządzania połączeniami serwera z komputerem. Użyte bez parametrów [it] wyświetla informacje o wszystkich sesjach z komputerem lokalnym”.

Oto podstawowy proces mojej podanej implementacji:

  1. @echo off
    • Wyłącz wyświetlanie poleceń
  2. goto check_Permissions
    • Przejdź do :check_Permissionsbloku kodu
  3. net session >nul 2>&1
    • Uruchom polecenie
    • Ukryj wizualne wyjście polecenia
      1. Przekierowanie standardowego STDOUTstrumienia wyjściowego (uchwyt numeryczny 1 / ) donul
      2. Przekierowanie standardowego strumienia wyjściowego błędu (uchwyt numeryczny 2 / STDERR) do tego samego miejsca docelowego, co uchwyt numeryczny 1
  4. if %errorLevel% == 0
    • Jeśli wartość kodu wyjścia ( %errorLevel%) jest równa, 0 oznacza to, że nie wystąpiły żadne błędy, a zatem natychmiastowe poprzednie polecenie zostało pomyślnie uruchomione
  5. else
    • Jeśli wartość kodu wyjścia ( %errorLevel%) nie jest równa, 0 oznacza to, że wystąpiły błędy, a zatem natychmiastowe poprzednie polecenie nie powiodło się
  6. Kod między nawiasami zostanie wykonany w zależności od tego, które kryteria są spełnione

 

Zrzuty ekranu

Windows 8AT %errorLevel% :

[imgur]

 

NET SESSIONw systemie Windows XP x86 - Windows 8 x64 :

[imgur]

 

Dziękuję, @Tilka, za zmianę zaakceptowanej odpowiedzi na moją. :)

mythofechelon
źródło
13
+1 Świetna robota! Dobre badania. Twój post powinien być nową akceptowaną odpowiedzią.
blak3r
13
To rozwiązanie zwykle działa świetnie, ale jeśli usługa „Serwer” (LanmanServer) zostanie zatrzymana, kod błędu dla „Usługa serwera nie została uruchomiona” to ten sam kod błędu, który pojawia się w przypadku „Odmowa dostępu”, co powoduje fałszywe negatywne . Innymi słowy, istnieją przypadki, w których można uruchomić tę kontrolę z uprawnieniami administracyjnymi i zwróci ten sam błąd, jak bez tych uprawnień.
Lectrode
3
@Lectrode Opublikowałem alternatywne rozwiązanie, które nie ma tego samego problemu: stackoverflow.com/questions/4051883/…
and31415
8
Ten kod zwraca wartość fałszywie dodatnią (przynajmniej w systemie Windows 7), jeśli użytkownik jest użytkownikiem zaawansowanym. Zaawansowany użytkownik może również „podwyższyć”, a następnie uruchomić net sessionpomyślnie (ERRORLEVEL = 0) - ale tak naprawdę nie ma uprawnień administratora. Używanie openfiles(patrz odpowiedź Lucretiusa poniżej) nie ma tego problemu.
EM0
1
Powoduje to zawieszenie monitu, jeśli urządzenie sieciowe nie działa w pełni (np. Debugowanie systemu Windows). fltmc> nul 2> & 1 działa lepiej pod tym względem.
kevinf
80

Rozwiązanie Andersa działało dla mnie, ale nie byłem pewien, jak je odwrócić, aby uzyskać odwrotną sytuację (gdy nie byłeś administratorem).

Oto moje rozwiązanie. Ma dwa przypadki, IF i ELSE, oraz trochę sztuki ascii, aby ludzie naprawdę ją czytali. :)

Minimalna wersja

Rushyo opublikował to rozwiązanie tutaj: Jak wykryć, czy CMD działa jako Administrator / ma podwyższone uprawnienia?

NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
    ECHO NOT AN ADMIN!
)

Wersja, która dodaje komunikaty o błędach, wstrzymuje i wychodzi

@rem ----[ This code block detects if the script is being running with admin PRIVILEGES If it isn't it pauses and then quits]-------
echo OFF
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
   echo ######## ########  ########   #######  ########  
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ######   ########  ########  ##     ## ########  
   echo ##       ##   ##   ##   ##   ##     ## ##   ##   
   echo ##       ##    ##  ##    ##  ##     ## ##    ##  
   echo ######## ##     ## ##     ##  #######  ##     ## 
   echo.
   echo.
   echo ####### ERROR: ADMINISTRATOR PRIVILEGES REQUIRED #########
   echo This script must be run as administrator to work properly!  
   echo If you're seeing this after clicking on a start menu icon, then right click on the shortcut and select "Run As Administrator".
   echo ##########################################################
   echo.
   PAUSE
   EXIT /B 1
)
@echo ON

Działa na WinXP -> Win8 (w tym wersje 32/64 bitowe).

EDYCJA: 28.08.2012 Zaktualizowano do obsługi systemu Windows 8. @ BenHooper zwrócił na to uwagę w swojej odpowiedzi poniżej. Proszę głosować za jego odpowiedzią.

blak3r
źródło
1
ATnie działa w systemie Windows 8, ale znalazłem lepsze rozwiązanie. Wysłałem to tutaj jako odpowiedź: stackoverflow.com/questions/4051883/… (lub możesz po prostu przewinąć w dół, cokolwiek).
mythofechelon
1
Zastanawiam się, czy dwie linie if% errorLevel% == / EQU na pierwszym bloku kodu to TYPO .. proszę o poprawienie.
Ujjwal Singh,
@UjjwalSingh To na pewno było. Dzięki za złapanie. Zaktualizowałem to.
blak3r
Może chcesz zastąpić „Rushyo opublikował to rozwiązanie tutaj” komentarzem na mój temat, teraz, gdy używasz mojego rozwiązania? :)
mythofechelon
Nie działa w przypadku grupy administratorów domeny dodanej do grupy administratorów na komputerze lokalnym i zalogowania się z użytkownikiem administratora domeny.
MCRohith,
46

Więcej problemów

Jak wskazał @Lectrode, jeśli spróbujesz uruchomić net sessionpolecenie, gdy usługa serwera jest zatrzymana, pojawi się następujący komunikat o błędzie:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

W takim przypadku %errorLevel%zmienna zostanie ustawiona na 2.

Uwaga Usługa serwera nie jest uruchamiana w trybie awaryjnym (z siecią lub bez).

Poszukuję alternatywy

Coś takiego:

  • może być uruchamiany po wyjęciu z pudełka w systemie Windows XP i nowszych (32- i 64-bitowy);
  • nie dotyka rejestru ani żadnego pliku / folderu systemowego;
  • działa niezależnie od ustawień regionalnych systemu;
  • daje prawidłowe wyniki nawet w trybie awaryjnym.

Uruchomiłem więc waniliową maszynę wirtualną z systemem Windows XP i zacząłem przewijać listę aplikacji w C:\Windows\System32folderze, próbując znaleźć jakieś pomysły. Po prób i błędów, to jest brudny (pun przeznaczone) zbliżyć mam wymyślić:

fsutil dirty query %systemdrive% >nul

fsutil dirtyPolecenia wymaga praw administratora do uruchomienia, a nie inaczej. %systemdrive%to zmienna środowiskowa, która zwraca literę dysku, na którym jest zainstalowany system operacyjny. Dane wyjściowe są przekierowywane nul, a zatem ignorowane. %errorlevel%Zmienna zostanie ustawiony 0tylko po pomyślnym wykonaniu.

Oto, co mówi dokumentacja:

Fsutil brudny

Odpytuje lub ustawia brudny bit woluminu. Gdy ustawiony jest brudny bit woluminu , autochk automatycznie sprawdza wolumin pod kątem błędów przy następnym uruchomieniu komputera.

Składnia

fsutil dirty {query | set} <VolumePath>

Parametry

query           Queries the specified volume's dirty bit.
set             Sets the specified volume's dirty bit.
<VolumePath>    Specifies the drive name followed by a colon or GUID.

Uwagi

Brudny bit woluminu wskazuje, że system plików może być niespójny. Brudny bit można ustawić, ponieważ:

  • Tom jest online i ma wyjątkowe zmiany.
  • Dokonano zmian w woluminie i komputer został zamknięty przed zatwierdzeniem zmian na dysku.
  • Wykryto uszkodzenie na woluminie.

Jeśli bit „brudny” zostanie ustawiony po ponownym uruchomieniu komputera, uruchomione zostanie polecenie chkdsk, aby zweryfikować integralność systemu plików i spróbować naprawić wszelkie problemy z woluminem.

Przykłady

Aby wysłać zapytanie o bit „brudny” na dysku C, wpisz:

fsutil dirty query C:

Dalsze badania

Chociaż powyższe rozwiązanie działa od systemu Windows XP, warto dodać, że Windows 2000 i Windows PE (środowisko preinstalowane) nie są dostarczane fsutil.exe, więc musimy skorzystać z czegoś innego.

Podczas poprzednich testów zauważyłem, że uruchomienie sfcpolecenia bez żadnych parametrów spowoduje albo:

  • błąd, jeśli nie masz wystarczających uprawnień;
  • lista dostępnych parametrów i ich wykorzystania.

To znaczy: bez parametrów, bez imprezy . Chodzi o to, że możemy przeanalizować dane wyjściowe i sprawdzić, czy dostaliśmy tylko błąd:

sfc 2>&1 | find /i "/SCANNOW" >nul

Wyjście błędu jest najpierw przekierowywane na standardowe wyjście, które następnie jest przesyłane potokowo do findpolecenia. W tym momencie musimy szukać jedynego parametru, który jest obsługiwany we wszystkich wersji systemu Windows do systemu Windows 2000: /SCANNOW. Wyszukiwanie nie rozróżnia wielkości liter, a dane wyjściowe są odrzucane przez przekierowanie do nul.

Oto fragment dokumentacji:

Sfc

Skanuje i weryfikuje integralność wszystkich chronionych plików systemowych i zastępuje nieprawidłowe wersje poprawnymi wersjami.

Uwagi

Musisz być zalogowany jako członek grupy Administratorzy, aby uruchomić sfc.exe .

Przykładowe użycie

Oto kilka przykładów wklejania i uruchamiania:

Windows XP i nowszy

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b

Windows 2000 / Windows PE

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
sfc 2>&1 | find /i "/SCANNOW" >nul
exit /b

Dotyczy

  • Windows 2000
  • Windows XP
  • Windows Vista
  • System Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE
i31415
źródło
1
+1 Doskonałe rozwiązania. W szczególności rozwiązanie SFC wydaje się niezawodnym sprawdzaniem dla wszystkich omawianych systemów operacyjnych. Jeśli napotkam jakiekolwiek problemy z użyciem któregokolwiek z nich, zgłoszę je tutaj.
Lectrode
1
Każdy, kto chce użyć SFCczeku dla wszystkich systemów, musi być trochę kreatywny. Z jakiegoś powodu, zaczynając od Windows 8, SFCwypisuje tylko pojedyncze znaki. Aby pomyślnie przeanalizować dane wyjściowe, musisz wykonać następujące czynności: 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 osobne linie). Powinno to działać w systemie Windows 2000 przez Windows 2012 R2. Na marginesie, wolę FINDSTR, ponieważ ogólnie przetwarza rzeczy szybciej niż FIND.
Lectrode
Świetna robota, @ and31415! Nie przetestowałem fsutiljeszcze osobiście twojego rozwiązania, ale z tego, co widzę, wydaje się ono o wiele bardziej elastyczne niż moje rozwiązanie. Chociaż może nie tak elegancki. ;) Cieszę się, że między nami powstaje doskonałe, łatwe i elastyczne rozwiązanie do wykrywania administratora. :)
mythofechelon
1
Podczas uruchamiania FSUTIL możesz pominąć literę dysku i po prostu uruchomić, fsutil dirty query >nulgdy podniesiony, zwraca tekst pomocy i% errorlevel% = 0
SS64
4
@ ss64 Windows 10 nie zwraca już niezerowego poziomu błędu fsutil dirty query >nul, jednak fsutil dirty query %systemdrive% >nulnadal działa
bcrist
19

jeszcze dwa sposoby - szybki i kompatybilny wstecz.

fltmc >nul 2>&1 && (
  echo has admin permissions
) || (
  echo has NOT admin permissions
)

fltmc polecenie jest dostępne w każdym systemie Windows od XP, więc powinno być dość przenośne.


Jeszcze jedna bardzo szybkie rozwiązanie testowane na XP, 8.1, 7 - istnieje jedna zmienna specyficzny =::, który jest przedstawiony tylko jeśli sesja konsoli nie ma privileges.As administratora nie jest tak łatwo stworzyć zmienną, która zawiera =się w jego nazwa jest stosunkowo niezawodny sposób sprawdzić dla administratora uprawnienie (nie wywołuje zewnętrznych plików wykonywalnych, więc działa dobrze)

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)

Jeśli chcesz użyć tego bezpośrednio z wiersza poleceń, ale nie z pliku wsadowego, możesz użyć:

set ^"|find "::"||echo has admin permissions
npocmaka
źródło
Epic ... Czy zestaw „dv == ::” ma jakieś wady / ograniczenia?
script'n'code 21.04.17
Z jakiegoś powodu! Dv! Metoda zawsze mówi, że jestem administratorem, ale nie kliknąłem prawym przyciskiem myszy pliku wsadowego „Uruchom jako administrator” (Windows 10). Naprawdę myślałem, że ta metoda była bezbłędna. Podobała mi się ta metoda, ponieważ nie jest zależna od programów zewnętrznych. Teraz jestem smutny i nie wiem, co powoduje, że to nie działa / jest dla mnie niewiarygodne :(
script'n'code
1
@copyitright - Nie miałem tam maszyny do testowania Win10 :(. Chociaż istnienie =::zmiennej jest raczej błędem - reprezentuje nieistniejący dysk, więc prawdopodobnie zostało naprawione w win10.
npocmaka
Prawdopodobnie załatali to tak. Było fajnie dopóki to trwało.
script'n'code 23.04.17
1
Widzę, że =::jest zdefiniowany dla CMD niebędącego administratorem w Windows 10 1709. W każdym razie nie jest to niezawodny sposób, możesz łatwo zmusić go do zdefiniowania nawet w sesjach CMD administratora:subst :: c:\ & for %a in (::) do %a & set,
sst
17
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)
Anders
źródło
1
Wygląda na to, że w niektórych przypadkach test zawsze kończy się niepowodzeniem, nawet po podwyższeniu. W moim przypadku, gdy skrypt został wywołany przez moją aplikację.
boileau
15

alternatywne rozwiązanie:

@echo off
pushd %SystemRoot%
openfiles.exe 1>nul 2>&1
if not %errorlevel% equ 0 (
    Echo here you are not administrator!
) else (
    Echo here you are administrator!
)
popd
Pause
Lukrecjusz
źródło
7
Czy możesz dodać wyjaśnienie do swojej odpowiedzi?
bjb568,
4
Chociaż ten kod może odpowiedzieć na pytanie, należy dodać wyjaśnienie, dlaczego tak się dzieje.
PlasmaHH
2
Tak! Działa to poprawnie, nawet gdy użytkownik jest użytkownikiem zaawansowanym (w przeciwieństwie do „sesji sieciowej”). Jednak pushd / popd nie jest potrzebny. Wystarczy uruchomić openfilesi sprawdzić ERRORLEVEL.
EM0
2
Korzystałem z tego rozwiązania i działa dobrze. Problem polega na tym, openfiles.exeże nie działa w WinPE, więc skrypt zawsze zwróci, że użytkownik nie jest administratorem.
Wayfarer
Dokumentację dla openfiles.exe można znaleźć na technet.microsoft.com/de-de/library/bb490961.aspx . 1>i 2>&1są wyjaśnione na microsoft.com/resources/documentation/windows/xp/all/proddocs/… . nulodnosi się do zerowego urządzenia
1460043
13

Nie tylko sprawdza, ale automatycznie
otrzymuje uprawnienia administratora, czyli Automatyczny UAC dla Win 7/8 / 8.1 ff.
: Oto naprawdę fajna funkcja z jeszcze jedną funkcją: Ten fragment partii nie tylko sprawdza prawa administratora, ale pobiera je automatycznie! (i testuje wcześniej, jeśli żyjesz w systemie operacyjnym obsługującym UAC).

Dzięki tej sztuczce nie trzeba dłużej klikać prawym przyciskiem myszy pliku wsadowego „z uprawnieniami administratora”. Jeśli zapomniałeś, aby rozpocząć z podwyższonymi prawami, UAC pojawia się automatycznie! Co więcej, na początku jest testowany, czy system operacyjny potrzebuje / zapewnia UAC, więc zachowuje się poprawnie np. Dla Win 2000 / XP, dopóki nie przetestuje Win 8.1.

@echo off
REM Quick test for Windows generation: UAC aware or not ; all OS before NT4 ignored for simplicity
SET NewOSWith_UAC=YES
VER | FINDSTR /IL "5." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO
VER | FINDSTR /IL "4." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO


REM Test if Admin
CALL NET SESSION >nul 2>&1
IF NOT %ERRORLEVEL% == 0 (

    if /i "%NewOSWith_UAC%"=="YES" (
        rem Start batch again with UAC
        echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
        "%temp%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
    )

    rem Program will now start again automatically with admin rights! 
    rem pause
    goto :eof
)

Fragment łączy kilka dobrych wzorców wsadowych, szczególnie (1) test administratora w tym wątku autorstwa Ben Hooper i (2) aktywacja UAC odczytana na BatchGotAdmin i cytowana na stronie wsadowej przez robvanderwoude (szacunek). (3) W przypadku identyfikacji systemu operacyjnego według „wzorca VER | FINDSTR” po prostu nie znalazłem odniesienia.)

(Jeśli chodzi o niektóre bardzo drobne ograniczenia, gdy „SESJA NETTO” nie działa, jak wspomniano w innej odpowiedzi, możesz wstawić kolejne z tych poleceń. Dla mnie uruchomiona w trybie awaryjnym Windows lub wyłączone specjalne usługi standardowe i takie nie są ważnymi przypadkami użycia - może dla niektórych administratorów.)

Philm
źródło
To jest świetne! Zwróć uwagę na jedno - wywoływanie go z Visual Basic działa podobnie start- otwiera skrypt w nowym oknie. Jeśli chcesz zobaczyć wyniki - dodaj pausena końcu skryptu. Ponadto trudno jest wykryć, kiedy „utrzymujemy” poziom i kiedy następuje powtórka. Możesz do tego użyć argumentu wiersza poleceń: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…
Tomasz Gandor
@ Philm: Co jeśli UAC wymaga od użytkownika podania hasła? Zakładam, że ten kod nie daje im uprawnień administratora automatycznie bez uprzedniego wprowadzenia hasła ;-)
script'n'code
@copyitright. Nie, oczywiście nie. Ale jeśli hasło jest konieczne lub nie, nie ma tutaj różnicy: To, co miałem na myśli mówiąc „automatycznie”, to oczywiście to, że skrypt powoduje, że system Windows automatycznie pyta o prawa, a nie więcej. Bez takiej konstrukcji skrypt wsadowy nie powiedzie się, jeśli zostanie uruchomiony podwójnym kliknięciem lub podobnie. Aby tego uniknąć, użytkownik musiałby z góry wiedzieć, że skrypt wymaga podwyższonych uprawnień i musiał go w ten sposób uruchomić.
Philm
Tak więc mój skrypt pozwala autorowi plików wsadowych przesunąć moment niezbędnego podniesienia do punktu podczas wykonywania wsadu, który on lub ona chce. Lub innymi słowy: Aby umożliwić wygodniejsze wykonywanie przez zwykłe „podwójne kliknięcie”. Ponieważ rozważałem takie pliki wsadowe zwykle używane przez profesjonalistów lub użytkowników z bardzo dobrą znajomością podstawowej technologii Windows, nie wyjaśniłem tego szczegółowo.
Philm
12

Mam dwa sposoby sprawdzania uprzywilejowanego dostępu, oba są dość niezawodne i bardzo przenośne w prawie każdej wersji systemu Windows.

1. Metoda

set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%

mkdir %WINDIR%\%guid%>nul 2>&1
rmdir %WINDIR%\%guid%>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Jest to jedna z najbardziej niezawodnych metod, ze względu na jej prostotę, a zachowanie tego bardzo prymitywnego polecenia jest mało prawdopodobne, aby się zmieniło. Nie dotyczy to innych wbudowanych narzędzi CLI, takich jak sesja sieciowa, które można wyłączyć za pomocą zasad administratora / sieci lub poleceń, takich jak fsutils, które zmieniły dane wyjściowe w systemie Windows 10.

* Działa na XP i nowszych

2. Metoda

REG ADD HKLM /F>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Czasami nie podoba ci się pomysł dotknięcia dysku użytkownika, nawet jeśli jest on tak nieszkodliwy jak używanie fsutils lub tworzenie pustego folderu, czy jest to niemożliwe do udowodnienia, ale może spowodować katastrofalną awarię, jeśli coś pójdzie nie tak. W tym scenariuszu możesz po prostu sprawdzić rejestr uprawnień.

W tym celu można spróbować utworzyć klucz na HKEY_LOCAL_MACHINE użyciu domyślnych uprawnień dostaniesz Access Denied a ERRORLEVEL == 1, ale jeśli uruchomić jako administrator, to wypisze „komenda wykonana pomyślnie” i ERRORLEVEL == 0. Ponieważ klucz już istnieje, nie ma on wpływu na rejestr. Jest to prawdopodobnie najszybszy sposób, a REG jest tam od dłuższego czasu.

* Nie jest dostępny w wersjach wcześniejszych niż NT (Win 9X).

* Działa na XP i nowszych


Przykład roboczy

Skrypt usuwający folder tymczasowy

Vitim.us
źródło
1
Naprawdę podoba mi się metoda rejestru. Naprawdę pamiętam to, nie muszę tego sprawdzać za każdym razem, gdy go używam.
Miscreant
8

W skrypcie wsadowym Elevate.cmd (patrz ten link ), który napisałem w celu uzyskania uprawnień administratora , zrobiłem to w następujący sposób:

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

Jest to testowane na Windows 7, 8, 8.1, 10, a nawet Windows XP i nie wymaga żadnych zasobów, takich jak specjalny katalog, plik lub klucz rejestru.

Matt
źródło
6

Najczystszym sposobem sprawdzenia uprawnień administratora za pomocą skryptu CMD, który znalazłem, jest mniej więcej taki:

@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

Ta metoda używa tylko wbudowanych plików CMD.exe, więc powinna być bardzo szybka. Sprawdza również rzeczywiste możliwości procesu, zamiast sprawdzania identyfikatorów SID lub członkostwa w grupach, dlatego testowane jest skuteczne uprawnienie. I działa to już w Windows 2003 i XP. Normalne procesy użytkownika lub procesy nieokreślone zawodzą sondę katalogu, w przypadku której powiodły się procesy administracyjne lub podwyższone.

William
źródło
1
Copyitright wskazał, że jest to niewiarygodne. Jeśli odwiedzisz% windir% \ system32 \ config \ systemprofile w oknie Eksploratora i zatwierdzisz za pomocą UAC, okno CMD może pomyślnie przekierować zawartość. Prowadzi cię do myślenia, że ​​masz wzniesienie, kiedy go nie masz.
Tyler Szabo
5

Poniżej próbuje utworzyć plik w katalogu Windows. Jeśli zasysa, usunie go.

copy /b/y NUL %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
if errorlevel 1 goto:nonadmin
del %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
:admin
rem here you are administrator
goto:eof
:nonadmin
rem here you are not administrator
goto:eof

Należy zauważyć, że 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 to identyfikator GUID, który został wygenerowany dzisiaj i zakłada się, że jest mało prawdopodobne, aby kolidował z istniejącą nazwą pliku.

Benoit
źródło
+1, ponieważ zaakceptowana odpowiedź spowodowała nieskończenie wiele okien poleceń, gdy skrypt został wywołany z mojej aplikacji.
boileau
was generated today and it is assumed to be improbable to conflict with an existing filename.z wyjątkiem sytuacji, gdy dwie osoby używają tego kodu
Vitim.us
4

Whoami / grupy nie działają w jednym przypadku. Jeśli masz całkowicie wyłączone UAC (nie tylko powiadomienie wyłączone) i zacząłeś od monitu administratora, a następnie wydałeś:

runas /trustlevel:0x20000 cmd

będziesz działał bez podniesienia uprawnień, ale wystawiając:

whoami /groups

powie, że jesteś podwyższony. To jest źle. Oto dlaczego jest źle:

Podczas działania w tym stanie, jeśli IsUserAdmin ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389(v=vs.85).aspx ) zwraca FALSE i UAC jest całkowicie wyłączone, a GetTokenInformation zwraca TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx ), wówczas proces nie jest podniesiony, ale whoami /groupstwierdzi, że tak.

naprawdę najlepszym sposobem na zrobienie tego z pliku wsadowego jest:

net session >nul 2>nul
net session >nul 2>nul
echo %errorlevel%

Powinieneś zrobić net sessiondwa razy, ponieważ jeśli ktoś zrobił to atwcześniej, otrzymasz błędne informacje.

zumalifeguard
źródło
whoami /groupsnie podaje niewłaściwych informacji. Po prostu runas /trustlevelstawia Cię w nieoczekiwanym miejscu: działa bez uprawnień administratora, ale z wysokim poziomem integralności. Możesz to potwierdzić za pomocą Process Explorer. (To może być błąd, runasale nie błąd whoami.)
Harry Johnston,
Harry, słyszę, co mówisz, ale czy możesz to rozwinąć? Nie rozumiem komentarza dotyczącego runas /trustlevel Kiedy jesteś lokalnym administratorem, a UAC jest wyłączony, wydanie polecenia runas z monitu administratora wprowadzi cię w kontekst bezpieczeństwa „podstawowego użytkownika”. W tym trybie nie można wykonywać operacji administracyjnych. Wypróbuj „sesję sieciową” lub fsutil ”lub dowolne inne narzędzie wymagające dostępu administratora. Jednak„ whoami / groups ”informuje cię, że jesteś podniesiony. Kiedy nie jesteś. Fakt, że wywołanie GetTokenInformation zwraca„ TokenElevationTypeDefault ”, wskazuje na to.
zumalifeguard,
Nie jestem pewien, czy rozumiem, co rozumiesz przez „whoami / grupy mówią ci, że jesteś podwyższony”; nie wyświetla dosłownie ciągu „jesteś podniesiony”, prawda? Na jaką część produkcji Whoami / grup patrzysz?
Harry Johnston,
Harry, rozumiem, że nie byłem jasny. Pierwsze tło, więc ty i ja jesteśmy na tej samej stronie. istnieje kilka sztuczek, których ludzie używają do określania, czy wiersz polecenia jest aktualnie uruchomiony w stanie, który ma dostęp administratora. Typowe techniki to używanie wbudowanego polecenia, takiego jak fsutil, at, whoami i „net session”. Używanie „at” jest przestarzałe. Jeśli przeszukasz tę stronę, zobaczysz przykłady użycia fsutil, whoami i „net session”. Zobacz tutaj więcej przykładów whoami: stackoverflow.com/questions/7985755/…
zumalifeguard
Również użycie wyrażenia „bieg na podwyższeniu” nie jest do końca poprawne. To, co ja (i inni) powinienem powiedzieć „działa z uprawnieniami administratora”. Jeśli Kontrola konta jest wyłączona, działa to po zalogowaniu jako administrator lokalny, ale nie obniża jawnie poziomu zaufania, takiego jak w przypadku Run. Gdy UAC jest włączony, oznacza to, że użytkownik działa z podwyższonym monitem.
zumalifeguard,
2
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)
Totonga
źródło
2
Problem polega na tym, że sprawdzasz, czy użytkownik ma uprawnienia administratora. Ale skrypt wsadowy może działać bez uprawnień administratora.
tanascius
2
Plus whoaminie jest obsługiwany w systemie Windows XP.
mythofechelon
Whoami / groups ma przypadek, w którym dostajesz błędne informacje. Zobacz stackoverflow.com/questions/4051883/…
zumalifeguard
2

Niektóre serwery wyłączają usługi, których wymaga polecenie „sesja sieciowa”. Powoduje to, że sprawdzenie administratora zawsze mówi, że nie masz uprawnień administratora, kiedy możesz.

Dan
źródło
2

Edycja: copyitright wskazał, że jest to niewiarygodne. Zatwierdzenie dostępu do odczytu za pomocą UAC pozwoli dirowi odnieść sukces. Mam trochę więcej skryptu, aby zaoferować inną możliwość, ale nie jest to tylko do odczytu.

reg query "HKLM\SOFTWARE\Foo" >NUL 2>NUL && goto :error_key_exists
reg add "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_not_admin
reg delete "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_failed_delete
goto :success

:error_failed_delete
  echo Error unable to delete test key
  exit /b 3
:error_key_exists
  echo Error test key exists
  exit /b 2
:error_not_admin
  echo Not admin
  exit /b 1
:success
  echo Am admin

Stara odpowiedź poniżej

Ostrzeżenie: zawodny


Na podstawie wielu innych dobrych odpowiedzi tutaj i punktów poruszonych przez and31415 stwierdziłem, że jestem fanem następujących rzeczy:

dir "%SystemRoot%\System32\config\DRIVERS" 2>nul >nul || echo Not Admin

Kilka zależności i szybko.

Tyler Szabo
źródło
1
To rozwiązanie kiedyś działało dla mnie, ale odkąd przeszukałem lokalizację i uzyskałem dostęp do folderu, do którego potrzebujesz podwyższonych uprawnień, kod błędu / zakończenia zawsze ma teraz wartość 0, pomimo uruchomienia skryptu jako standardowy użytkownik.
script'n'code
1

Uwaga: Sprawdzanie za pomocą cacls \ system32 \ config \ system ZAWSZE kończy się niepowodzeniem w WOW64 (na przykład z% systemroot% \ syswow64 \ cmd.exe / 32 bit Total Commander), więc skrypty działające w powłoce 32-bitowej w systemie 64-bitowym będą się zapętlać na zawsze ... Lepiej byłoby sprawdzić prawa w katalogu pobierania wstępnego:

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\Prefetch\"

Przetestowano Win XP do 7, jednak nie działa w WinPE, ponieważ w Windows 7 install. Wim nie ma takiego katalogu ani cacls.exe

Również w winPE AND wow64 kończy się niepowodzeniem, sprawdź w openfiles.exe:

OPENFILES > nul

W systemie Windows 7 poziom błędu będzie oznaczony „1” z informacją, że „System docelowy musi być 32-bitowym systemem operacyjnym”

Oba sprawdzenie prawdopodobnie również nie powiedzie się w konsoli odzyskiwania.

Co działa w systemie Windows XP - 8 32/64 bit, w WOW64 aw WinPE są: dir Próby stworzenia (IF Administrator nie dywan zbombardowany katalogu Windows z uprawnieniami dla każdego ...) i

net session

i

reg add HKLM /F

czeki.

Jeszcze jedna uwaga w niektórych Windows XP (i prawdopodobnie także w innych wersjach, w zależności od majsterkowania administratora) w zależności od wpisów w rejestrze bezpośrednio wywołujących bat / cmd ze skryptu .vbs nie powiedzie się z informacją, że pliki bat / cmd nie są powiązane z niczym ...

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo

Z drugiej strony wywołanie cmd.exe z parametrem pliku bat / cmd działa OK:

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/C %~s0", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo
użytkownik2902818
źródło
1

Dosłownie dziesiątki odpowiedzi w tym i połączonych pytaniach oraz w innych miejscach w SE, z których wszystkie są w ten czy inny sposób wadliwe, wyraźnie pokazały, że Windows nie zapewnia niezawodnego wbudowanego narzędzia konsoli. Czas więc wprowadzić własną wersję.

Poniższy kod C, oparty na Wykryj, czy program działa z pełnymi uprawnieniami administratora , działa w Win2k + 1 , w dowolnym miejscu i we wszystkich przypadkach (UAC, domeny, grupy przechodnie ...) - ponieważ robi to samo, co sam system, gdy sprawdza uprawnienia. Sygnalizuje wynik zarówno komunikatem (który można wyciszyć przełącznikiem), jak i kodem wyjścia.

Musi tylko być kompilowany raz, potem można po prostu skopiować .exewszędzie - to zależy tylko kernel32.dlli advapi32.dll(mam przesłał kopię ).

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

1 MSDN twierdzi, że interfejsy API to XP +, ale to nieprawda. CheckTokenMembership wynosi 2k +, a drugi jest jeszcze starszy . Ostatni link zawiera również znacznie bardziej skomplikowany sposób, który działałby nawet w NT.

ivan_pozdeev
źródło
1

PowerShell ktoś?

param (
    [string]$Role = "Administrators"
)

#check for local role

$identity  = New-Object Security.Principal.WindowsIdentity($env:UserName)
$principal = New-Object Security.Principal.WindowsPrincipal($identity)

Write-Host "IsInRole('$Role'): " $principal.IsInRole($Role)

#enumerate AD roles and lookup

$groups = $identity::GetCurrent().Groups
foreach ($group in $groups) {
    $trans = $group.Translate([Security.Principal.NTAccount]);
    if ($trans.Value -eq $Role) {
       Write-Host "User is in '$Role' role"
    }
}
Ostati
źródło
1

Oto kolejna do dodania do listy ;-)

(spróbuj utworzyć plik w lokalizacji systemowej)

CD.>"%SystemRoot%\System32\Drivers\etc\_"
MODE CON COLS=80 LINES=25

IF EXIST "%SystemRoot%\System32\Drivers\etc\_" (

  DEL "%SystemRoot%\System32\Drivers\etc\_"

  ECHO Has Admin privileges

) ELSE (

  ECHO No Admin privileges

)

MODE CONReinicjalizuje ekran i surpresses żadnych błędów tekstowych / kiedy nie mając uprawnień do zapisu do lokalizacji systemu.

skrypt i kod
źródło
0

Alternatywnie: użyj zewnętrznego narzędzia, które jest przeznaczone do tego celu, np. IsAdmin.exe (nieograniczone darmowe oprogramowanie).

Kody wyjścia:

0 - bieżący użytkownik nie będący członkiem grupy Administratorzy

1 - Bieżący członek Administratorów i działający z podwyższonym poziomem uprawnień

2 - Bieżący członek Administratorów, ale nie działający z podwyższonym poziomem uprawnień

Bill_Stewart
źródło
0
@echo off
ver
set ADMDIR=C:\Users\Administrator
dir %ADMDIR% 1>nul 2>&1
echo [%errorlevel%] %ADMDIR%
if "%errorlevel%"=="0" goto main
:: further checks e.g. try to list the contents of admin folders
:: wherever they are stored on older versions of Windows
echo You need administrator privileges to run this script: %0
echo Exiting...
exit /b

:main
echo Executing with Administrator privileges...
cmd
źródło
0
@echo off
:start
set randname=%random%%random%%random%%random%%random%
md \windows\%randname% 2>nul
if %errorlevel%==0 (echo You're elevated!!!
goto end)
if %errorlevel%==1 (echo You're not elevated :(:(
goto end)
goto start
:end
rd \windows\%randname% 2>nul
pause >nul

Wyjaśnię kod wiersz po wierszu:

@echo off

Bez tego użytkownicy będą zirytowani wieloma więcej niż 1 liniami.

:start

Punkt, w którym rozpoczyna się program.

set randname=%random%%random%%random%%random%%random%

Ustaw nazwę pliku katalogu, który ma zostać utworzony.

md \windows\%randname% 2>nul

Tworzy katalog na <DL>:\Windows(zamień <DL> na literę dysku).

if %errorlevel%==0 (echo You're elevated!!!
goto end)

Jeśli zmienna środowiskowa ERRORLEVEL ma wartość zero, oznacza to komunikat o powodzeniu echa.
Idź do końca (nie idź dalej).

if %errorlevel%==1 (echo You're not elevated :(:(
goto end)

Jeśli ERRORLEVEL ma wartość jeden, wyświetl komunikat o błędzie echa i przejdź do końca.

goto start

Jeśli nazwa pliku już istnieje, utwórz ponownie folder (w przeciwnym razie goto endpolecenie nie pozwoli temu uruchomić).

:end

Określ punkt końcowy

rd \windows\%randname% 2>nul

Usuń utworzony katalog.

pause >nul

Zatrzymaj się, aby użytkownik mógł zobaczyć wiadomość.

Uwaga : >nuli 2>nulfiltrują dane wyjściowe tych poleceń.

EKons
źródło
Tak, wiem, że kiedy zalogujesz się jako użytkownik Administrator (nie użytkownik o typie konta administratora), zawsze będziesz wyższy, ale to nie jest błąd!
EKons,
0

net user %username% >nul 2>&1 && echo admin || echo not admin

heretyk
źródło
Wydaje się to błędne, pokazuje, czy użytkownik ma uprawnienia administratora, ale nie ma to związku z pytaniem, czy bieżący plik cmd.exe jest uruchamiany z uprawnieniami administratora
jeb
nie, pokazuje, czy bieżący cmd.exe ma dostęp administracyjny do bazy danych użytkowników, czy nie, więc działa nawet w przypadku, gdy nie ma „sesji sieciowej”. alternatywnie "net config> nul 2> & 1 && echo admin || echo not admin" wykonuje zadanie. Obie konstrukcje zostały pomyślnie przetestowane na Windows XP pod kontem gościa, użytkownika zaawansowanego i administracyjnym z LanmanServer zatrzymanym (poziom błędu 2 dla cmd.exe uruchamiany w trybie gościa i użytkownika zaawansowanego, poziom błędu 0 dla cmd.exe z uprawnieniami administratora). Czy będzie działał w Vista i później z wyżej wymienionymi problemami UAC - nie wiem, więc byłoby miło, gdyby ktoś mógł to przetestować.
heretyk
2
Testowałem z dwoma oknami cmd (win7x64), zacząłem z prawami administratora i bez nich. W obu przypadkach pokazuje toadmin
jeb
0

Myślę, że najprostszym sposobem jest zmiana daty systemowej (która wymaga uprawnień administratora):

date %date%
if errorlevel 1 (
   echo You have NOT admin rights
) else (
   echo You have admin rights
)

Jeśli %date%zmienna może obejmować dzień tygodnia, wystarczy pobrać datę z ostatniej części DATEpolecenia:

for /F "delims=" %%a in ('date ^<NUL') do set "today=%%a" & goto break
:break
for %%a in (%today%) do set "today=%%a"
date %today%
if errorlevel 1 ...
Aacini
źródło
3
Nie mogę się powstrzymać od głosowania za taką destrukcyjną „radą”.
ivan_pozdeev
2
Pomijając nawet fakt, że zmiana czasu systemowego bez uzasadnionego powodu strzela w stopę (różnego rodzaju dziwne efekty w oprogramowaniu) - jeśli używasz aktualnego czasu, nadal wypaczasz go do czasu wykonania polecenia.
ivan_pozdeev
2
@ivan_pozdeev: Być może mógłbyś opisać tylko jeden z „dziwnych efektów dla oprogramowania”, które mogą się zdarzyć, gdy data zostanie zmieniona na tę samą datę w sesji cmd.exe ...
Aacini
1
Zobacz także superuser.com/questions/27263/…
ivan_pozdeev,
@ivan_pozdeev: Żaden z twoich linków nie jest nawet zdalnie powiązany z moją metodą. Myślę, że źle zrozumiałeś moje rozwiązanie. Ta metoda może mieć tylko jeden z dwóch możliwych wyników: nic się nie zmienia (jeśli użytkownik nie ma uprawnień administratora) lub DATA zmienia się NA SAMĄ WARTOŚĆ (jeśli użytkownik ma uprawnienia administratora). Moja metoda NIE ZMIENIA CZASU! Zapraszam do ponownego przeczytania mojej odpowiedzi i wyjaśnienia prostym językiem powodów, dla których przegłosowano ...:(
Aacini,
0

Znalazłem użytkownika, który może korzystać, net sessionmimo że nie jest administratorem. Nie zastanawiałem się dlaczego. Moim obejściem jest sprawdzenie, czy użytkownik może utworzyć folder w folderze Windows.

Oto mój kod:

::::::: :testadmin function START :::::::
:: this function tests if current user is admin.  results are returned as "true" or "false" in %isadmin%
:: Test "%isadmin" after calling this function
:: Usage: "call :testadmin"
echo Your script entered the :testadmin function by error.  Usage: "call :testadmin"
pause
exit /b
:testadmin

 rd %windir%\local_admin_test > nul 2> nul
 md %windir%\local_admin_test > nul 2> nul
 if [%errorlevel%]==[0] set isadmin=true
 if not [%errorlevel%]==[0] set isadmin=false
 rd %windir%\local_admin_test > nul 2> nul

 if [%isadmin%]==[true] (
   echo User IS admin.
 )
 if not [%isadmin%]==[true] (
   echo User IS NOT admin.
   timeout 30
   :: or use "pause" instead of "timeout"
   exit /b
 )
exit /b
:::::: :testadmin function END ::::::
Grallen
źródło
0

Zbiór czterech pozornie najbardziej zgodnych metod z tej strony. Ten pierwszy jest naprawdę genialny. Testowane od XP w górę. Mylące jest jednak to, że nie ma standardowej komendy dostępnej do sprawdzenia uprawnień administratora. Myślę, że teraz skupiają się na PowerShell, który jest naprawdę bezużyteczny dla większości moich własnych prac.

Nazwałem partię „exit-if-not-admin.cmd”, którą można wywołać z innych partii, aby upewnić się, że nie będą kontynuować wykonywania, jeśli nie zostaną podane wymagane uprawnienia administratora.

rem Sun May 03, 2020

rem Methods for XP+ used herein based on:
rem /programming/4051883/batch-script-how-to-check-for-admin-rights
goto method1

:method1
setlocal enabledelayedexpansion
set "dv==::"
if defined !dv! goto notadmin
goto admin

:method2
call fsutil dirty query %SystemDrive% >nul
if %ERRORLEVEL%==0 goto admin
goto notadmin

:method3
net session >nul 2>&1
if %ERRORLEVEL%==0 goto admin
goto notadmin

:method4
fltmc >nul 2>&1 && goto admin
goto notadmin

:admin
echo Administrator rights detected
goto end

:notadmin
echo ERROR: This batch must be run with Administrator privileges
pause
exit /b
goto end

:end```
wschodzące kule
źródło
-1

Oto moje 2 grosze warte:

Potrzebowałem partii do uruchomienia w środowisku domeny podczas procesu logowania użytkownika, w środowisku „pracowni”, widząc, że użytkownicy przestrzegają zasad „blokowania” i ograniczonego widoku (dystrybuowanych głównie przez zestawy GPO).

Zestaw GPO domeny jest stosowany przed połączonym skryptem logowania użytkownika AD Tworzenie skryptu logowania GPO było zbyt dojrzałe, ponieważ „nowy” profil użytkowników nie został utworzony / załadowany / ani gotowy do zastosowania „usuń i / lub” Przypnij pasek zadań i elementy menu Start vbscript + dodaj niektóre pliki lokalne.

np .: proponowane środowisko profilu „domyślny użytkownik” wymaga skrótu „.URL” (.lnk) umieszczonego w „% ProgramData% \ Microsoft \ Windows \ Start Menu \ Programs * MyNewOWA.url *” i „C: Lokalizacje \ Users \ Public \ Desktop \ * MyNewOWA.url * ”, między innymi

Użytkownicy mają wiele komputerów w domenie, gdzie tylko te ustawione komputery „pracownicze” wymagają tych zasad.

Te foldery wymagają uprawnień administratora do zmiany i chociaż „użytkownik domeny” należy do lokalnej grupy „administrator”, kolejnym wyzwaniem było UAC.

Znalazłem różne adaptacje i połączyłem tutaj. Mam również niektórych użytkowników urządzeń BYOD, którzy wymagali innych plików z problemami z perm. Nie testowałem na XP (trochę za stary system operacyjny), ale kod jest obecny, bardzo chciałbym otrzymać informację zwrotną.

    :: ------------------------------------------------------------------------
    :: You have a royalty-free right to use, modify, reproduce and distribute
    :: the Sample Application Files (and/or any modified version) in any way
    :: you find useful, provided that you agree that the author provides
    :: no warranty, obligations or liability for any Sample Application Files.
    :: ------------------------------------------------------------------------

    :: ********************************************************************************
    ::* Sample batch script to demonstrate the usage of RunAs.cmd
    ::*
    ::* File:           RunAs.cmd
    ::* Date:           12/10/2013
    ::* Version:        1.0.2
    ::*
    ::* Main Function:  Verifies status of 'bespoke' Scripts ability to 'Run As - Admin'
    ::*                 elevated privileges and without UAC prompt
    ::*
    ::* Usage:          Run RunAs.cmd from desired location
    ::*         Bespoke.cmd will be created and called from C:\Utilities location
    ::*         Choose whether to delete the script after its run by removing out-comment
    ::*                 (::) before the 'Del /q Bespoke.cmd' command
    ::*
    ::* Distributed under a "GNU GPL" type basis.
    ::*
    ::* Revisions:
    ::* 1.0.0 - 08/10/2013 - Created.
    ::* 1.0.1 - 09/10/2013 - Include new path creation.
    ::* 1.0.2 - 12/10/2013 - Modify/shorten UAC disable process for Admins
    ::*
    ::* REFERENCES:
    ::* Sample "*.inf" secpol.msc export from Wins 8 x64 @ bottom, 
    ::* Would be default but for 'no password complexities'
    ::*
    ::* To recreate UAC default: 
    ::* Goto:Secpol, edit out Exit, modify .inf set, export as "Wins8x64.inf" 
    ::* and import using secedit cmd provided
    ::*
    :: ********************************************************************************

    @echo off & cls
    color 9F
    Title RUN AS
    Setlocal
    :: Verify local folder availability for script
    IF NOT EXIST C:\Utilities (
        mkdir C:\Utilities & GOTO:GenBatch
    ) ELSE (
        Goto:GenBatch
    )
    :GenBatch
    c:
    cd\
    cd C:\Utilities
    IF NOT EXIST C:\Utilities\Bespoke.cmd (
        GOTO:CreateBatch
    ) ELSE (
        Goto:RunBatch
    )
    :CreateBatch
    Echo. >Bespoke.cmd
    Echo :: ------------------------------------------------------------------------ >>Bespoke.cmd
    Echo :: You have a royalty-free right to use, modify, reproduce and distribute >>Bespoke.cmd
    Echo :: the Sample Application Files (and/or any modified version) in any way >>Bespoke.cmd
    Echo :: you find useful, provided that you agree that the author provides >>Bespoke.cmd
    Echo :: has no warranty, obligations or liability for any Sample Application Files. >>Bespoke.cmd
    Echo :: ------------------------------------------------------------------------ >>Bespoke.cmd
    Echo. >>Bespoke.cmd
    Echo :: ******************************************************************************** >>Bespoke.cmd
    Echo ::* Sample batch script to demonstrate the usage of Bespoke.cmd >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* File:           Bespoke.cmd >>Bespoke.cmd
    Echo ::* Date:           10/10/2013 >>Bespoke.cmd
    Echo ::* Version:        1.0.1 >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Main Function:  Allows for running of Bespoke batch with elevated rights and no future UAC 'pop-up' >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Usage:          Called and created by RunAs.cmd run from desired location >>Bespoke.cmd
    Echo ::*                 Found in the C:\Utilities folder >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Distributed under a "GNU GPL" type basis. >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Revisions: >>Bespoke.cmd
    Echo ::* 1.0.0 - 09/10/2013 - Created. >>Bespoke.cmd
    Echo ::* 1.0.1 - 10/10/2013 - Modified, added ability to temp disable UAC pop-up warning. >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* REFERENCES: >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Exit code (%%^ErrorLevel%%) 0 - No errors have occurred, i.e. immediate previous command ran successfully >>Bespoke.cmd
    Echo ::* Exit code (%%^ErrorLevel%%) 1 - Errors occurred, i.e. immediate previous command ran Unsuccessfully >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* MS OS version check >>Bespoke.cmd
    Echo ::* http://msdn.microsoft.com/en-us/library/windows/desktop/ms724833%28v=vs.85%29.aspx >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Copying to certain folders and running certain apps require elevated perms >>Bespoke.cmd
    Echo ::* Even with 'Run As ...' perms, UAC still pops up. >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* To run a script or application in the Windows Shell >>Bespoke.cmd
    Echo ::* http://ss64.com/vb/shellexecute.html >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo ::* Machines joined to a corporate Domain should have the UAC feature set from, and >>Bespoke.cmd
    Echo ::* pushed out from a DC GPO policy >>Bespoke.cmd
    Echo ::* e.g.: 'Computer Configuration - Policies - Windows Settings - Security Settings -  >>Bespoke.cmd
    Echo ::* Local Policies/Security Options - User Account Control -  >>Bespoke.cmd
    Echo ::* Policy: User Account Control: Behavior of the elevation prompt for administrators >>Bespoke.cmd
    Echo ::*         in Admin Approval Mode  Setting: Elevate without prompting >>Bespoke.cmd
    Echo ::* >>Bespoke.cmd
    Echo :: ******************************************************************************** >>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo @Echo off ^& cls>>Bespoke.cmd
    Echo color 9F>>Bespoke.cmd
    Echo Title RUN AS ADMIN>>Bespoke.cmd
    Echo Setlocal>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo Set "_OSVer=">>Bespoke.cmd
    Echo Set "_OSVer=UAC">>Bespoke.cmd
    Echo VER ^| FINDSTR /IL "5." ^>NUL>>Bespoke.cmd
    Echo IF %%^ErrorLevel%%==0 SET "_OSVer=PreUAC">>Bespoke.cmd
    Echo IF %%^_OSVer%%==PreUAC Goto:XPAdmin>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo :: Check if machine part of a Domain or within a Workgroup environment >>Bespoke.cmd
    Echo Set "_DomainStat=">>Bespoke.cmd
    Echo Set "_DomainStat=%%USERDOMAIN%%">>Bespoke.cmd
    Echo If /i %%^_DomainStat%% EQU %%^computername%% (>>Bespoke.cmd
    Echo Goto:WorkgroupMember>>Bespoke.cmd
    Echo ) ELSE (>>Bespoke.cmd
    Echo Set "_DomainStat=DomMember" ^& Goto:DomainMember>>Bespoke.cmd
    Echo )>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo :WorkgroupMember>>Bespoke.cmd
    Echo :: Verify status of Secpol.msc 'ConsentPromptBehaviorAdmin' Reg key >>Bespoke.cmd
    Echo reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin ^| Find /i "0x0">>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo If %%^ErrorLevel%%==0 (>>Bespoke.cmd
    Echo    Goto:BespokeBuild>>Bespoke.cmd
    Echo ) Else (>>Bespoke.cmd
    Echo    Goto:DisUAC>>Bespoke.cmd
    Echo )>>Bespoke.cmd
    Echo :DisUAC>>Bespoke.cmd
    Echo :XPAdmin>>Bespoke.cmd
    Echo :DomainMember>>Bespoke.cmd
    Echo :: Get ADMIN Privileges, Start batch again, modify UAC ConsentPromptBehaviorAdmin reg if needed >>Bespoke.cmd
    Echo ^>nul ^2^>^&1 ^"^%%^SYSTEMROOT%%\system32\cacls.exe^"^ ^"^%%^SYSTEMROOT%%\system32\config\system^">>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo IF ^'^%%^Errorlevel%%^'^ NEQ '0' (>>Bespoke.cmd
    Echo    echo Set objShell = CreateObject^^("Shell.Application"^^) ^> ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    echo objShell.ShellExecute ^"^%%~s0^"^, "", "", "runas", 1 ^>^> ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    del ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
    Echo    exit /B>>Bespoke.cmd
    Echo ) else (>>Bespoke.cmd
    Echo    pushd ^"^%%^cd%%^">>Bespoke.cmd
    Echo    cd /d ^"^%%~dp0^">>Bespoke.cmd
    Echo    @echo off>>Bespoke.cmd
    Echo )>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo IF %%^_OSVer%%==PreUAC Goto:BespokeBuild>>Bespoke.cmd
    Echo IF %%^_DomainStat%%==DomMember Goto:BespokeBuild>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f>>Bespoke.cmd
    Echo.>>Bespoke.cmd
    Echo :BespokeBuild>>Bespoke.cmd
    Echo :: Add your script requiring elevated perm and no UAC below: >>Bespoke.cmd
    Echo.>>Bespoke.cmd

    :: PROVIDE BRIEF EXPLINATION AS TO WHAT YOUR SCRIPT WILL ACHIEVE
    Echo ::

    :: ADD THE "PAUSE" BELOW ONLY IF YOU SET TO SEE RESULTS FROM YOUR SCRIPT
    Echo Pause>>Bespoke.cmd

    Echo Goto:EOF>>Bespoke.cmd
    Echo :EOF>>Bespoke.cmd
    Echo Exit>>Bespoke.cmd

    Timeout /T 1 /NOBREAK >Nul
    :RunBatch
    call "Bespoke.cmd"
    :: Del /F /Q "Bespoke.cmd"

    :Secpol
    :: Edit out the 'Exit (rem or ::) to run & import default wins 8 security policy provided below
    Exit

    :: Check if machine part of a Domain or within a Workgroup environment
    Set "_DomainStat="
    Set _DomainStat=%USERDOMAIN%
    If /i %_DomainStat% EQU %computername% (
        Goto:WorkgroupPC
    ) ELSE (
        Echo PC Member of a Domain, Security Policy determined by GPO
        Pause
        Goto:EOF
    )

    :WorkgroupPC

    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin | Find /i "0x5"
    Echo.
    If %ErrorLevel%==0 (
        Echo Machine already set for UAC 'Prompt'
        Pause
        Goto:EOF
    ) else (
        Goto:EnableUAC
    )
    :EnableUAC
    IF NOT EXIST C:\Utilities\Wins8x64Def.inf (
        GOTO:CreateInf
    ) ELSE (
        Goto:RunInf
    )
    :CreateInf
    :: This will create the default '*.inf' file and import it into the 
    :: local security policy for the Wins 8 machine
    Echo [Unicode]>>Wins8x64Def.inf
    Echo Unicode=yes>>Wins8x64Def.inf
    Echo [System Access]>>Wins8x64Def.inf
    Echo MinimumPasswordAge = ^0>>Wins8x64Def.inf
    Echo MaximumPasswordAge = ^-1>>Wins8x64Def.inf
    Echo MinimumPasswordLength = ^0>>Wins8x64Def.inf
    Echo PasswordComplexity = ^0>>Wins8x64Def.inf
    Echo PasswordHistorySize = ^0>>Wins8x64Def.inf
    Echo LockoutBadCount = ^0>>Wins8x64Def.inf
    Echo RequireLogonToChangePassword = ^0>>Wins8x64Def.inf
    Echo ForceLogoffWhenHourExpire = ^0>>Wins8x64Def.inf
    Echo NewAdministratorName = ^"^Administrator^">>Wins8x64Def.inf
    Echo NewGuestName = ^"^Guest^">>Wins8x64Def.inf
    Echo ClearTextPassword = ^0>>Wins8x64Def.inf
    Echo LSAAnonymousNameLookup = ^0>>Wins8x64Def.inf
    Echo EnableAdminAccount = ^0>>Wins8x64Def.inf
    Echo EnableGuestAccount = ^0>>Wins8x64Def.inf
    Echo [Event Audit]>>Wins8x64Def.inf
    Echo AuditSystemEvents = ^0>>Wins8x64Def.inf
    Echo AuditLogonEvents = ^0>>Wins8x64Def.inf
    Echo AuditObjectAccess = ^0>>Wins8x64Def.inf
    Echo AuditPrivilegeUse = ^0>>Wins8x64Def.inf
    Echo AuditPolicyChange = ^0>>Wins8x64Def.inf
    Echo AuditAccountManage = ^0>>Wins8x64Def.inf
    Echo AuditProcessTracking = ^0>>Wins8x64Def.inf
    Echo AuditDSAccess = ^0>>Wins8x64Def.inf
    Echo AuditAccountLogon = ^0>>Wins8x64Def.inf
    Echo [Registry Values]>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Setup\RecoveryConsole\SecurityLevel=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Setup\RecoveryConsole\SetCommand=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\CachedLogonsCount=1,"10">>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ForceUnlockLogon=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\PasswordExpiryWarning=4,5>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ScRemoveOption=1,"0">>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin=4,5>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorUser=4,3>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableCAD=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayLastUserName=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableInstallerDetection=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableSecureUIAPaths=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableUIADesktopToggle=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableVirtualization=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\FilterAdministratorToken=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeCaption=1,"">>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeText=7,>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\PromptOnSecureDesktop=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ScForceOption=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ShutdownWithoutLogon=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\UndockWithoutLogon=4,1>>Wins8x64Def.inf
    Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ValidateAdminCodeSignatures=4,^0>>Wins8x64Def.inf
    Echo MACHINE\Software\Policies\Microsoft\Windows\Safer\CodeIdentifiers\AuthenticodeEnabled=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\AuditBaseObjects=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\CrashOnAuditFail=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\DisableDomainCreds=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\EveryoneIncludesAnonymous=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\FullPrivilegeAuditing=3,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\LimitBlankPasswordUse=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\MSV1_0\NTLMMinClientSec=4,536870912>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\MSV1_0\NTLMMinServerSec=4,536870912>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymous=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Print\Providers\LanMan Print Services\Servers\AddPrinterDrivers=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\SecurePipeServers\Winreg\AllowedExactPaths\Machine=7,System\CurrentControlSet\Control\ProductOptions,System\CurrentControlSet\Control\Server Applications,Software\Microsoft\Windows NT\CurrentVersion>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\SecurePipeServers\Winreg\AllowedPaths\Machine=7,System\CurrentControlSet\Control\Print\Printers,System\CurrentControlSet\Services\Eventlog,Software\Microsoft\OLAP Server,Software\Microsoft\Windows NT\CurrentVersion\Print,Software\Microsoft\Windows NT\CurrentVersion\Windows,System\CurrentControlSet\Control\ContentIndex,System\CurrentControlSet\Control\Terminal Server,System\CurrentControlSet\Control\Terminal Server\UserConfig,System\CurrentControlSet\Control\Terminal Server\DefaultUserConfiguration,Software\Microsoft\Windows NT\CurrentVersion\Perflib,System\CurrentControlSet\Services\SysmonLog>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\Kernel\ObCaseInsensitive=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\ClearPageFileAtShutdown=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\ProtectionMode=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\optional=7,Posix>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\AutoDisconnect=4,15>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\EnableForcedLogOff=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\EnableSecuritySignature=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\NullSessionPipes=7,>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\RequireSecuritySignature=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\RestrictNullSessAccess=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnablePlainTextPassword=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnableSecuritySignature=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\RequireSecuritySignature=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\LDAP\LDAPClientIntegrity=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange=4,^0>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\MaximumPasswordAge=4,30>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\RequireSignOrSeal=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\RequireStrongKey=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\SealSecureChannel=4,1>>Wins8x64Def.inf
    Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\SignSecureChannel=4,1>>Wins8x64Def.inf
    Echo [Privilege Rights]>>Wins8x64Def.inf
    Echo SeNetworkLogonRight = *S-1-1-0,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeBackupPrivilege = *S-1-5-32-544,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeChangeNotifyPrivilege = *S-1-1-0,*S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551,*S-1-5-90-^0>>Wins8x64Def.inf
    Echo SeSystemtimePrivilege = *S-1-5-19,*S-1-5-32-544>>Wins8x64Def.inf
    Echo SeCreatePagefilePrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeDebugPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeRemoteShutdownPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeAuditPrivilege = *S-1-5-19,*S-1-5-20>>Wins8x64Def.inf
    Echo SeIncreaseQuotaPrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544>>Wins8x64Def.inf
    Echo SeIncreaseBasePriorityPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeLoadDriverPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeBatchLogonRight = *S-1-5-32-544,*S-1-5-32-551,*S-1-5-32-559>>Wins8x64Def.inf
    Echo SeServiceLogonRight = *S-1-5-80-0,*S-1-5-83-^0>>Wins8x64Def.inf
    Echo SeInteractiveLogonRight = Guest,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeSecurityPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeSystemEnvironmentPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeProfileSingleProcessPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeSystemProfilePrivilege = *S-1-5-32-544,*S-1-5-80-3139157870-2983391045-3678747466-658725712-1809340420>>Wins8x64Def.inf
    Echo SeAssignPrimaryTokenPrivilege = *S-1-5-19,*S-1-5-20>>Wins8x64Def.inf
    Echo SeRestorePrivilege = *S-1-5-32-544,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeShutdownPrivilege = *S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
    Echo SeTakeOwnershipPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeDenyNetworkLogonRight = Guest>>Wins8x64Def.inf
    Echo SeDenyInteractiveLogonRight = Guest>>Wins8x64Def.inf
    Echo SeUndockPrivilege = *S-1-5-32-544,*S-1-5-32-545>>Wins8x64Def.inf
    Echo SeManageVolumePrivilege = *S-1-5-32-544>>Wins8x64Def.inf
    Echo SeRemoteInteractiveLogonRight = *S-1-5-32-544,*S-1-5-32-555>>Wins8x64Def.inf
    Echo SeImpersonatePrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-6>>Wins8x64Def.inf
    Echo SeCreateGlobalPrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-6>>Wins8x64Def.inf
    Echo SeIncreaseWorkingSetPrivilege = *S-1-5-32-545,*S-1-5-90-^0>>Wins8x64Def.inf
    Echo SeTimeZonePrivilege = *S-1-5-19,*S-1-5-32-544,*S-1-5-32-545>>Wins8x64Def.inf
    Echo SeCreateSymbolicLinkPrivilege = *S-1-5-32-544,*S-1-5-83-^0>>Wins8x64Def.inf
    Echo [Version]>>Wins8x64Def.inf
    Echo signature="$CHICAGO$">>Wins8x64Def.inf
    Echo Revision=1>>Wins8x64Def.inf

    :RunInf
    :: Import 'Wins8x64Def.inf' with ADMIN Privileges, to modify UAC ConsentPromptBehaviorAdmin reg
    >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%%\system32\config\system"
    IF '%Errorlevel%' NEQ '0' (
        echo Set objShell = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo objShell.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
       "%temp%%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
        Secedit /configure /db secedit.sdb /cfg C:\Utilities\Wins8x64Def.inf /overwrite
        Goto:CheckUAC
    ) else (
        Secedit /configure /db secedit.sdb /cfg C:\Utilities\Wins8x64Def.inf /overwrite
        @echo off
    )
    :CheckUAC
    reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin | Find /i "0x5"
    Echo.
    If %ErrorLevel%==0 (
        Echo ConsentPromptBehaviorAdmin set to 'Prompt'
        Pause
        Del /Q C:\Utilities\Wins8x64Def.inf
        Goto:EOF
    ) else (
        Echo ConsentPromptBehaviorAdmin NOT set to default
        Pause
    )
    ENDLOCAL
    :EOF
    Exit

Komputery PC w domenie powinny być w jak największym stopniu zarządzane przez zestawy GPO. Ten skrypt może zarządzać maszynami grupy roboczej / samodzielnej.

Pamiętaj, że monit UAC wyskakuje co najmniej raz na komputerze grupy roboczej BYOD (gdy tylko wymagane jest pierwsze podniesienie do „uprawnień administratora”), ale ponieważ lokalne zasady bezpieczeństwa są modyfikowane do użytku administracyjnego od tego momentu, wyskakujące okienka znikną.

Komputer z domeną powinien mieć ustawioną zasadę GPO „ConsentPromptBehaviorAdmin” w ramach „już” utworzonej zasady „Blokowania” - jak wyjaśniono w sekcji „REFERENCJE” skryptu.

Ponownie uruchom import secedit.exe domyślnego pliku „.inf”, jeśli utkniesz w całej debacie „Do UAC lub Not to UAC” :-).

btw: @boileau Sprawdź swoją awarię na:

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

Uruchamiając tylko „% SYSTEMROOT% \ system32 \ cacls.exe” lub „% SYSTEMROOT% \ system32 \ config \ system” lub oba z wiersza polecenia - podwyższone lub nie, sprawdź wynik na całej tablicy.

Ian Stockdale
źródło
-2

Kolejny sposób to zrobić.

REM    # # # #      CHECKING OR IS STARTED AS ADMINISTRATOR     # # # # #

FSUTIL | findstr /I "volume" > nul&if not errorlevel 1  goto Administrator_OK

cls
echo *******************************************************
echo ***    R U N    A S    A D M I N I S T R A T O R    ***
echo *******************************************************
echo.
echo.
echo Call up just as the Administrator. Abbreviation can be done to the script and set:
echo.
echo      Shortcut ^> Advanced ^> Run as Administrator
echo.
echo.
echo Alternatively, a single run "Run as Administrator"
echo or in the Schedule tasks with highest privileges
pause > nul
goto:eof
:Administrator_OK

REM Some next lines code ...
Artur Zgadzaj
źródło
Jaki powinien być ten link? Oznaczony jako spam z powodu linku.
mmgross,
Sprawdź tę odpowiedź, aby uzyskać kod, który automatycznie sprawdza i monituje: stackoverflow.com/a/30590134/4932683
cyberponk