Batch-Skript: So überprüfen Sie, ob Administratorrechte vorhanden sind

280

Wie überprüfe ich, ob das aktuelle Batch-Skript Administratorrechte hat?

Ich weiß, wie man es dazu bringt, sich mit Runas aufzurufen, aber nicht, wie man nach Administratorrechten sucht. Die einzigen Lösungen, die ich gesehen habe, sind grobe Hack-Jobs oder die Verwendung externer Programme. Nun, eigentlich ist es mir egal, ob es ein Hack-Job ist, solange er unter Windows XP und neuer funktioniert.

Flacs
quelle
2
nachdem Sie das Recht ändern können: [So fordern Sie Administratorzugriff in einer Batch-Datei an] [1] [1]: stackoverflow.com/questions/1894967/…
Alban
Siehe auch: superuser.com/questions/667607/...
ivan_pozdeev

Antworten:

465

Probleme

Die Lösung von blak3r / Rushyo funktioniert für alles außer Windows 8. Unter ATWindows 8 führt dies zu folgenden Ergebnissen:

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

The request is not supported.

(siehe Screenshot 1) und wird zurückkehren %errorLevel% 1.

 

Forschung

Also habe ich nach anderen Befehlen gesucht, für die erhöhte Berechtigungen erforderlich sind. rationallyparanoid.com hatte eine Liste von einigen, daher habe ich jeden Befehl auf den beiden entgegengesetzten Extremen der aktuellen Windows-Betriebssysteme (XP und 8) ausgeführt, in der Hoffnung, einen Befehl zu finden, dem der Zugriff auf beide Betriebssysteme verweigert wird, wenn er mit Standardberechtigungen ausgeführt wird.

Schließlich fand ich einen - NET SESSION. Eine echte , saubere und universelle Lösung, die Folgendes nicht beinhaltet:

  • die Erstellung oder Interaktion mit Daten an sicheren Orten
  • Analysieren von Daten, die von FORSchleifen zurückgegeben werden
  • Suche nach Zeichenfolgen für "Administrator"
  • using AT(Windows 8 nicht kompatibel) oder WHOAMI(Windows XP nicht kompatibel).

Jedes davon hat seine eigenen Sicherheits-, Benutzerfreundlichkeits- und Portabilitätsprobleme.

 

Testen

Ich habe unabhängig bestätigt, dass dies funktioniert auf:

  • 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

(siehe Screenshot 2)

 

Implementierung / Nutzung

Um diese Lösung zu verwenden, gehen Sie einfach wie folgt vor:

@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

Verfügbar hier, wenn Sie faul sind: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

 

Erläuterung

NET SESSIONist ein Standardbefehl zum "Verwalten von Server-Computer-Verbindungen. Ohne Parameter werden [es] Informationen zu allen Sitzungen mit dem lokalen Computer angezeigt."

Hier ist der grundlegende Prozess meiner gegebenen Implementierung:

  1. @echo off
    • Deaktivieren Sie die Anzeige von Befehlen
  2. goto check_Permissions
    • Zum :check_PermissionsCodeblock springen
  3. net session >nul 2>&1
    • Führen Sie den Befehl aus
    • Verstecken Sie die visuelle Ausgabe des Befehls durch
      1. Umleiten des STDOUTStreams der Standardausgabe (numerisches Handle 1 / ) nachnul
      2. Umleiten des Standardfehlerausgabestreams (numerisches Handle 2 / STDERR) an dasselbe Ziel wie das numerische Handle 1
  4. if %errorLevel% == 0
    • Wenn der Wert des Exit-Codes ( %errorLevel%) ist, 0 bedeutet dies, dass keine Fehler aufgetreten sind und daher der unmittelbar vorhergehende Befehl erfolgreich ausgeführt wurde
  5. else
    • Wenn der Wert des Exit-Codes ( %errorLevel%) nicht 0 ist, bedeutet dies, dass Fehler aufgetreten sind und der unmittelbar vorhergehende Befehl daher nicht erfolgreich ausgeführt wurde
  6. Der Code zwischen den jeweiligen Klammern wird ausgeführt, je nachdem, welche Kriterien erfüllt sind

 

Screenshots

Windows 8AT %errorLevel% :

[imgur]

 

NET SESSIONunter Windows XP x86 - Windows 8 x64 :

[imgur]

 

Vielen Dank, @Tilka, dass Sie Ihre akzeptierte Antwort in meine geändert haben. :) :)

mythofechelon
quelle
12
+1 Super Job! Gute Forschung. Ihr Beitrag sollte eine neue akzeptierte Antwort verdienen.
Blak3r
13
Diese Lösung funktioniert normalerweise hervorragend, aber wenn der Dienst "Server" (LanmanServer) gestoppt wird, ist der Fehlercode für "Serverdienst wurde nicht gestartet" derselbe Fehlercode, den Sie für "Zugriff verweigert" erhalten, was zu einem falsch negativen Ergebnis führt . Mit anderen Worten, es gibt Fälle, in denen Sie diese Prüfung mit Administratorrechten ausführen können und derselbe Fehler wie ohne diese Privilegien zurückgegeben wird.
Lectrode
3
@Lectrode Ich habe eine alternative Lösung veröffentlicht, die nicht das gleiche Problem hat: stackoverflow.com/questions/4051883/…
and31415
8
Dieser Code gibt ein falsches Positiv zurück (zumindest unter Windows 7), wenn der Benutzer ein Hauptbenutzer ist. Ein net sessionHauptbenutzer kann auch "erhöhen" und dann erfolgreich ausführen (ERRORLEVEL = 0) - er hat jedoch keine Administratorrechte. Die Verwendung openfiles(siehe Antwort von Lucretius unten) hat dieses Problem nicht.
EM0
1
Dies hängt die Eingabeaufforderung auf, wenn das Netzwerkgerät nicht vollständig funktioniert (z. B. Windows-Debugging). fltmc> nul 2> & 1 funktioniert in dieser Hinsicht besser.
Kevinf
80

Die Anders-Lösung hat bei mir funktioniert, aber ich war mir nicht sicher, wie ich sie umkehren sollte, um das Gegenteil zu erreichen (wenn Sie kein Administrator waren).

Hier ist meine Lösung. Es gibt zwei Fälle, einen IF- und einen ELSE-Fall, und einige ASCII-Fälle, um sicherzustellen, dass die Leute sie tatsächlich lesen. :) :)

Minimale Version

Rushyo hat diese Lösung hier veröffentlicht: Wie erkennt man, ob CMD als Administrator ausgeführt wird / über erhöhte Berechtigungen verfügt?

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

Version, die Fehlermeldungen, Pausen und Exits hinzufügt

@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

Funktioniert unter WinXP -> Win8 (einschließlich 32/64-Bit-Versionen).

BEARBEITEN: 28.08.2012 Aktualisiert, um Windows 8 zu unterstützen. @BenHooper hat dies in seiner Antwort unten hervorgehoben. Bitte stimmen Sie seiner Antwort zu.

blak3r
quelle
1
ATfunktioniert nicht unter Windows 8, aber ich habe eine bessere Lösung gefunden. Ich habe es hier als Antwort gepostet: stackoverflow.com/questions/4051883/… (oder Sie könnten einfach nach unten scrollen, was auch immer).
Mythosofechelon
1
Ich frage mich, ob zwei Zeilen von% errorLevel% == / EQU im ersten Codeblock ein TYPO sind. Bitte korrigieren.
Ujjwal Singh
@ UjjwalSingh Es war sicher. Danke fürs Fangen. Ich habe es aktualisiert.
Blak3r
Möchten Sie möglicherweise "Rushyo hat diese Lösung hier veröffentlicht" durch Ihren Kommentar zu mir ersetzen, nachdem Sie meine Lösung verwendet haben? :)
Mythosofechelon
Funktioniert nicht für die Domänenadministratorgruppe, die der Administratorgruppe auf dem lokalen Computer hinzugefügt und mit dem Domänenadministratorbenutzer angemeldet wurde.
MCRohith
46

Weitere Probleme

Wie von @Lectrode ausgeführt, wird beim Versuch, den net sessionBefehl auszuführen, während der Serverdienst gestoppt ist, die folgende Fehlermeldung angezeigt:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

In diesem Fall wird die %errorLevel%Variable auf gesetzt 2.

Hinweis Der Serverdienst wird im abgesicherten Modus (mit oder ohne Netzwerk) nicht gestartet.

Auf der Suche nach einer Alternative

Etwas das:

  • kann unter Windows XP und höher (32 und 64 Bit) sofort ausgeführt werden;
  • Berührt weder die Registrierung noch eine Systemdatei / einen Systemordner.
  • funktioniert unabhängig vom Systemgebietsschema;
  • liefert auch im abgesicherten Modus korrekte Ergebnisse.

Also habe ich eine virtuelle Vanilla Windows XP-Maschine gebootet und angefangen, durch die Liste der Anwendungen im C:\Windows\System32Ordner zu scrollen , um einige Ideen zu bekommen. Nach Versuchen und Irrtümern ist dies der schmutzige (Wortspiel beabsichtigte) Ansatz, den ich mir ausgedacht habe:

fsutil dirty query %systemdrive% >nul

Der fsutil dirtyBefehl erfordert Administratorrechte, um ausgeführt zu werden, und schlägt andernfalls fehl. %systemdrive%ist eine Umgebungsvariable, die den Laufwerksbuchstaben zurückgibt, auf dem das Betriebssystem installiert ist. Die Ausgabe wird umgeleitet nulund somit ignoriert. Die %errorlevel%Variable wird 0erst nach erfolgreicher Ausführung auf gesetzt.

In der Dokumentation heißt es:

Fsutil schmutzig

Fragt das Dirty-Bit eines Volumes ab oder setzt es. Wenn das Dirty-Bit eines Volumes gesetzt ist, überprüft Autochk das Volume beim nächsten Neustart des Computers automatisch auf Fehler.

Syntax

fsutil dirty {query | set} <VolumePath>

Parameter

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.

Bemerkungen

Das Dirty-Bit eines Volumes zeigt an, dass sich das Dateisystem möglicherweise in einem inkonsistenten Zustand befindet. Das Dirty-Bit kann gesetzt werden, weil:

  • Der Band ist online und hat herausragende Änderungen.
  • Am Volume wurden Änderungen vorgenommen und der Computer wurde heruntergefahren, bevor die Änderungen auf die Festplatte übertragen wurden.
  • Auf dem Volumen wurde eine Beschädigung festgestellt.

Wenn das Dirty-Bit beim Neustart des Computers gesetzt ist, wird chkdsk ausgeführt , um die Integrität des Dateisystems zu überprüfen und um zu versuchen, Probleme mit dem Volume zu beheben.

Beispiele

Geben Sie Folgendes ein, um das Dirty-Bit auf Laufwerk C abzufragen:

fsutil dirty query C:

Weitere Nachforschungen

Die obige Lösung funktioniert zwar ab Windows XP, es lohnt sich jedoch hinzuzufügen, dass Windows 2000 und Windows PE (vorinstallierte Umgebung) nicht mitgeliefert werden. Daher müssen fsutil.exewir auf etwas anderes zurückgreifen.

Bei meinen vorherigen Tests habe ich festgestellt, dass das Ausführen des sfcBefehls ohne Parameter zu folgenden Ergebnissen führen würde:

  • ein Fehler, wenn Sie nicht genügend Berechtigungen hatten;
  • eine Liste der verfügbaren Parameter und ihrer Verwendung.

Das heißt: keine Parameter, keine Partei . Die Idee ist, dass wir die Ausgabe analysieren und prüfen können, ob wir etwas anderes als einen Fehler haben:

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

Die Fehlerausgabe wird zuerst zur Standardausgabe umgeleitet, die dann an den findBefehl weitergeleitet wird. An dieser Stelle müssen wir nach dem einzigen Parameter suchen, der in allen Windows-Versionen seit Windows 2000 unterstützt wird : /SCANNOW. Bei der Suche wird die Groß- und Kleinschreibung nicht berücksichtigt, und die Ausgabe wird verworfen, indem sie an umgeleitet wird nul.

Hier ist ein Auszug aus der Dokumentation:

Sfc

Überprüft und überprüft die Integrität aller geschützten Systemdateien und ersetzt falsche Versionen durch korrekte Versionen.

Bemerkungen

Sie müssen als Mitglied der Gruppe Administratoren angemeldet sein, um sfc.exe ausführen zu können .

Beispielnutzung

Hier einige Beispiele zum Einfügen und Ausführen:

Windows XP und höher

@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

Gilt für

  • Windows 2000
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE
und 31415
quelle
1
+1 Hervorragende Lösungen. Insbesondere die SFC-Lösung scheint eine zuverlässige Überprüfung für alle fraglichen Betriebssysteme zu sein. Wenn ich bei einem dieser Probleme auf Probleme stoße, werde ich diese hier melden.
Lectrode
1
Für alle, die den SFCCheck für alle Systeme verwenden möchten, müssen Sie ein bisschen kreativ werden. Aus irgendeinem Grund werden ab Windows 8 SFCnur einzelne Zeichen ausgegeben. Um die Ausgabe erfolgreich zu analysieren, müssen Sie Folgendes tun: 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 separate Zeilen). Dies sollte unter Windows 2000 bis Windows 2012 R2 funktionieren. Nebenbei bemerkt, ich bevorzuge FINDSTR, weil es Dinge im Allgemeinen schneller verarbeitet als FIND.
Lectrode
Großartige Arbeit, @ and31415! Ich habe Ihre fsutilLösung noch nicht persönlich getestet, aber soweit ich sehen kann, scheint sie viel flexibler zu sein als meine Lösung. Obwohl vielleicht nicht ganz so elegant. ;) Ich bin froh zu sehen, dass wir zwischen uns eine exzellente, einfache und flexible Lösung zur Erkennung von Administratoren erhalten. :)
Mythosofechelon
1
Wenn Sie FSUTIL ausführen, können Sie den Laufwerksbuchstaben weglassen und nur ausführen, fsutil dirty query >nulwenn er erhöht ist. Dies gibt Hilfetext und% errorlevel% = 0
SS64
4
@ ss64 Windows 10 gibt keine Fehlerstufe ungleich Null mehr zurück fsutil dirty query >nul, fsutil dirty query %systemdrive% >nulfunktioniert jedoch immer noch
bcrist
19

Zwei weitere Möglichkeiten - schnell und abwärtskompatibel.

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

fltmc Der Befehl ist seit XP auf jedem Windows-System verfügbar, daher sollte dieser Befehl ziemlich portabel sein.


Eine weitere wirklich schnelle Lösung, die getestet XPwurde 8.1: 7 - Es gibt eine bestimmte Variable, =::die nur angezeigt wird, wenn die Konsolensitzung keine Administratorrechte hat. Da es nicht so einfach ist, eine Variable zu erstellen, die =ihren Namen enthält , ist dies eine vergleichsweise zuverlässige Methode, um nach Administratoren zu suchen Berechtigung (es ruft keine externen ausführbaren Dateien auf, daher funktioniert es gut)

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

Wenn Sie dies direkt über die Befehlszeile verwenden möchten, jedoch nicht aus einer Batchdatei, können Sie Folgendes verwenden:

set ^"|find "::"||echo has admin permissions
npocmaka
quelle
Episch ... Hat die eingestellte "dv == ::" - Lösung irgendwelche Nachteile / Einschränkungen?
script'n'code
Nun, aus irgendeinem Grund ist die! Dv! Die Methode sagt immer, dass ich Administrator bin, während ich nicht mit der rechten Maustaste auf "Als Administrator ausführen" in der Batch-Datei (Windows 10) geklickt habe. Ich fand diese Methode wirklich fehlerfrei. Ich habe diese Methode geliebt, weil sie nicht von externen Programmen abhängt. Jetzt bin ich traurig und ich weiß nicht, was es für mich scheitern / unzuverlässig macht :(
script'n'code
1
@copyitright - Ich hatte keine win10-Maschine, um es dort zu testen :(. Obwohl das Vorhandensein einer =::Variablen eher ein Fehler ist - es stellt ein nicht vorhandenes Laufwerk dar, so wurde es wahrscheinlich in win10 behoben.
npocmaka
Sie haben es wahrscheinlich ja gepatcht. Es hat Spaß gemacht, solange es dauerte.
script'n'code
1
Ich sehe, =::ist für Nicht-Administrator-CMD unter Windows 10 1709 definiert. Wie auch immer, es ist kein zuverlässiger Weg, Sie können es leicht erzwingen, selbst in Administrator-CMD-Sitzungen definiert zu werden:subst :: c:\ & for %a in (::) do %a & set,
11.
17
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)
Anders
quelle
1
Es scheint, dass der Test in einigen Fällen immer fehlgeschlagen ist, auch nachdem er erhöht wurde. In meinem Fall, als das Skript von meiner Anwendung aufgerufen wurde.
Boileau
15

alternative Lösung:

@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
Lukrez
quelle
7
Könnten Sie Ihrer Antwort eine Erklärung hinzufügen?
bjb568
4
Während dieser Code möglicherweise die Frage beantwortet, sollten Sie eine Erklärung hinzufügen, warum dies so ist.
PlasmaHH
2
Ja! Dies funktioniert auch dann korrekt, wenn der Benutzer ein Hauptbenutzer ist (im Gegensatz zu "Netzsitzung"). Pushd / Popd ist jedoch nicht erforderlich. Es reicht aus, nur openfilesERRORLEVEL auszuführen und zu überprüfen.
EM0
2
Ich habe diese Lösung verwendet und sie hat gut funktioniert. Das Problem ist, dass openfiles.exees in WinPE nicht funktioniert, sodass das Skript immer zurückgibt, dass der Benutzer kein Administrator ist.
Wayfarer
Die Dokumentation zu openfiles.exe finden Sie unter technet.microsoft.com/de-de/library/bb490961.aspx . 1>und 2>&1werden unter microsoft.com/resources/documentation/windows/xp/all/proddocs/… erklärt . nulbezieht sich auf die Null - Gerät
user1460043
13

Nicht nur überprüfen, sondern auch automatisch Administratorrechte erhalten, auch
bekannt als Automatic UAC for Win 7/8 / 8.1 ff.
: Das Folgende ist wirklich cool mit einer weiteren Funktion: Dieses Batch-Snippet prüft nicht nur die Administratorrechte, sondern erhält sie automatisch! (und Tests zuvor, wenn Sie auf einem UAC-fähigen Betriebssystem leben.)

Mit diesem Trick brauchen Sie nicht länger, um mit der rechten Maustaste auf Ihre Batch-Datei "mit Administratorrechten" zu klicken. Wenn Sie vergessen haben, es mit erhöhten Rechten zu starten, wird die Benutzerkontensteuerung automatisch gestartet! Darüber hinaus wird zunächst getestet, ob das Betriebssystem eine Benutzerkontensteuerung benötigt / bereitstellt, sodass es sich korrekt verhält, z. B. für Win 2000 / XP, bis Win 8.1 getestet wird.

@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
)

Das Snippet führt einige gute Batch-Muster zusammen, insbesondere (1) den Admin-Test in diesem Thread von Ben Hooper und (2) die UAC-Aktivierung, die auf BatchGotAdmin gelesen und auf der Batch-Site von robvanderwoude zitiert wurde (Respekt). (3) Für die Betriebssystemidentifikation durch "VER | FINDSTR-Muster" finde ich die Referenz einfach nicht.)

(In Bezug auf einige sehr geringfügige Einschränkungen, wenn "NET SESSION" nicht wie in einer anderen Antwort erwähnt funktioniert, können Sie einen weiteren dieser Befehle einfügen. Für mich ist das Ausführen im abgesicherten Windows-Modus oder spezielle Standarddienste nicht verfügbar, und dies sind keine wichtigen Anwendungsfälle - für einige Admins vielleicht sind sie.)

Philm
quelle
Das ist toll! Beachten Sie, dass das Aufrufen aus Visual Basic wie folgt funktioniert start: Öffnen des Skripts in einem neuen Fenster. Wenn Sie die Ergebnisse sehen möchten, fügen Sie pauseam Ende Ihres Skripts ein hinzu. Es ist auch schwer zu erkennen, wann wir erhöht bleiben und wann es eine Wiederholung gibt. Sie können dafür ein Befehlszeilenargument verwenden: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…
Tomasz Gandor
@Philm: Was ist, wenn der Benutzer bei der Benutzerkontensteuerung sein Kennwort eingeben muss? Ich
gehe
@copyitright. Nein natürlich nicht. Aber ob ein Passwort notwendig ist oder nicht, ist hier kein Unterschied: Was ich mit "automatisch" gemeint habe, ist natürlich, dass das Skript Windows dazu veranlasst, automatisch nach den Rechten zu fragen, nicht mehr. Ohne eine solche Konstruktion würde das Batch-Skript fehlschlagen, wenn es durch Doppelklick oder ähnliches gestartet würde. Um dies zu vermeiden, müsste der Benutzer im Voraus wissen, dass das Skript erhöhte Rechte erfordert und es so starten muss.
Philm
Mein Skript ermöglicht es dem Autor einer Batch-Datei also, den Moment der erforderlichen Erhöhung auf einen Punkt während der Batch-Ausführung zu verschieben, den er oder sie möchte. Oder mit anderen Worten: Um eine bequemere Ausführung durch normalen "Doppelklick" zu ermöglichen. Da ich solche Batchdateien in Betracht gezogen habe, die normalerweise von Fachleuten oder Benutzern mit sehr guten Kenntnissen der zugrunde liegenden Windows-Technologie verwendet werden, habe ich dies nicht im Detail erklärt.
Philm
12

Ich habe zwei Möglichkeiten, um nach privilegiertem Zugriff zu suchen. Beide sind ziemlich zuverlässig und in fast jeder Windows-Version sehr portabel.

1. Methode

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!
)

Dies ist aufgrund seiner Einfachheit eine der zuverlässigsten Methoden, und es ist sehr unwahrscheinlich, dass sich das Verhalten dieses sehr primitiven Befehls ändert. Das ist nicht der Fall von anderen integrierten in CLI - Tools wie ist Netto-Sitzung , die von admin / Netzwerkrichtlinien deaktiviert werden kann, oder Befehle wie fsutils , die die Ausgabe auf Windows 10 geändert.

* Funktioniert unter XP und höher

2. Methode

REG ADD HKLM /F>nul 2>&1

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

Manchmal gefällt Ihnen die Idee, die Benutzerfestplatte zu berühren, nicht, auch wenn sie so harmlos ist wie die Verwendung von fsutils oder das Erstellen eines leeren Ordners. Sie ist nicht beweisbar, kann jedoch zu einem katastrophalen Fehler führen, wenn etwas schief geht. In diesem Szenario können Sie einfach die Registrierung auf Berechtigungen überprüfen.

Zu diesem Zweck können Sie versuchen, einen Schlüssel für HKEY_LOCAL_MACHINE mit den Standardberechtigungen zu erstellen, für die Sie Zugriff verweigert und erhalten. ERRORLEVEL == 1Wenn Sie jedoch als Administrator ausgeführt werden, wird "Befehl erfolgreich ausgeführt" und gedruckt ERRORLEVEL == 0. Da der Schlüssel bereits vorhanden ist, hat er keine Auswirkungen auf die Registrierung. Dies ist wahrscheinlich der schnellste Weg, und die REG ist schon lange da.

* Es ist unter NT (Win 9X) nicht verfügbar.

* Funktioniert unter XP und höher


Arbeitsbeispiel

Ein Skript, das den temporären Ordner löscht

Vitim.us
quelle
1
Ich mag die Registrierungsmethode sehr. Ich kann mich tatsächlich daran erinnern und muss es nicht jedes Mal nachschlagen, wenn ich es benutze.
Miscreant
8

Im Batch-Skript Elevate.cmd (siehe diesen Link ), das ich geschrieben habe, um Administratorrechte zu erhalten , habe ich es folgendermaßen gemacht:

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

Dies ist für Windows 7, 8, 8.1, 10 und sogar Windows XP getestet und benötigt keine Ressourcen wie ein spezielles Verzeichnis, eine Datei oder einen Registrierungsschlüssel.

Matt
quelle
6

Der sauberste Weg, mit einem CMD-Skript, den ich gefunden habe, nach Administratorrechten zu suchen, ist ungefähr so:

@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

Diese Methode verwendet nur CMD.exe-integrierte Funktionen, daher sollte sie sehr schnell sein. Außerdem wird nach den tatsächlichen Funktionen des Prozesses gesucht, anstatt nach SIDs oder Gruppenmitgliedschaften zu suchen, sodass die effektive Berechtigung getestet wird. Und das funktioniert bereits unter Windows 2003 und XP. Normale Benutzerprozesse oder nicht erhöhte Prozesse schlagen bei der Verzeichnisprüfung fehl, wenn Administrator- oder erhöhte Prozesse erfolgreich sind.

Wilhelm
quelle
1
copyitright wies darauf hin, dass dies unzuverlässig ist. Wenn Sie% windir% \ system32 \ config \ systemprofile in einem Explorer-Fenster aufrufen und mit der Benutzerkontensteuerung genehmigen, kann das CMD-Fenster den Inhalt erfolgreich leiten. Sie glauben, Sie hätten eine Höhe, wenn Sie dies nicht tun.
Tyler Szabo
5

Im Folgenden wird versucht, eine Datei im Windows-Verzeichnis zu erstellen. Wenn es erfolgreich ist, wird es entfernt.

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

Beachten Sie, dass 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 eine heute generierte GUID ist und es unwahrscheinlich ist, dass Konflikte mit einem vorhandenen Dateinamen auftreten.

Benoit
quelle
+1, weil die akzeptierte Antwort dazu führte, dass unendlich viele Befehlsfenster geöffnet wurden, als das Skript von meiner Anwendung aufgerufen wurde.
Boileau
was generated today and it is assumed to be improbable to conflict with an existing filename.außer wenn zwei Personen diesen Code verwenden
Vitim.us
4

Die Whoami / Gruppen funktionieren in einem Fall nicht. Wenn Sie die Benutzerkontensteuerung vollständig deaktiviert haben (nicht nur die Benachrichtigung deaktiviert) und von einer Administrator-Eingabeaufforderung gestartet wurden, wurde Folgendes ausgegeben:

runas /trustlevel:0x20000 cmd

Sie werden nicht erhöht ausgeführt, aber Folgendes ausgeben:

whoami /groups

Ich werde sagen, du bist erhöht. Es ist falsch. Hier ist, warum es falsch ist:

Wenn IsUserAdmin ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389(v=vs.85).aspx ) in diesem Status ausgeführt wird, wird FALSE zurückgegeben und die Benutzerkontensteuerung ist vollständig deaktiviert, und GetTokenInformation gibt TokenElevationTypeDefault zurück ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx ) dann läuft der Prozess nicht erhöht, sondern whoami /groupsbehauptet es ist.

Der beste Weg, dies aus einer Batch-Datei heraus zu tun, ist:

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

Sie sollten dies net sessionzweimal tun, da atSie die falschen Informationen erhalten, wenn jemand zuvor eine Hand gemacht hat.

zumalifeguard
quelle
whoami /groupsliefert nicht die falschen Informationen. Es ist nur das, was runas /trustlevelSie an einen unerwarteten Ort bringt: Ausführen ohne Administratorrechte, aber mit hoher Integrität. Sie können dies mit Process Explorer bestätigen. (Dies kann ein Fehler sein runas, ist aber kein Fehler whoami.)
Harry Johnston
Harry, ich höre was du sagst, aber kannst du das näher erläutern? Ich verstehe den Kommentar nicht in Bezug auf runas /trustlevel Wenn Sie ein lokaler Administrator sind und die Benutzerkontensteuerung deaktiviert ist, werden Sie durch die Ausgabe dieses Befehls runas über eine Administrator-Eingabeaufforderung in einen Sicherheitskontext für "Basisbenutzer" versetzt. In diesem Modus können Sie keine Verwaltungsvorgänge ausführen. Versuchen Sie "net session" oder fsutil "oder ein anderes Dienstprogramm, für das Administratorzugriff erforderlich ist." Whoami / groups "gibt jedoch an, dass Sie erhöht sind. Wenn dies nicht der Fall ist. Die Tatsache, dass GetTokenInformation" TokenElevationTypeDefault "zurückgibt, weist darauf hin.
Zumalifeguard
Ich bin mir nicht sicher, ob ich verstehe, was du mit "whoami / groups sagt dir, dass du erhöht bist" meinst. Es gibt nicht buchstäblich die Zeichenfolge "Sie sind erhöht" aus, oder? Welchen Teil der Ausgabe von Whoami / Gruppen betrachten Sie?
Harry Johnston
Harry, ich sehe, ich war nicht klar. Erster Hintergrund, also sind Sie und ich auf derselben Seite. Es gibt eine Handvoll Tricks, mit denen festgestellt wird, ob eine Eingabeaufforderung derzeit in einem Status mit Administratorzugriff ausgeführt wird. Übliche Techniken sind die Verwendung des erstellten Befehls wie fsutil, at, whoami und "net session". Die Verwendung von "at" ist veraltet. Wenn Sie diese Seite durchsuchen, sehen Sie Beispiele mit fsutil, whoami und "net session". Weitere Beispiele für whoami finden
zumalifeguard
Auch die Verwendung des Ausdrucks "Laufen erhöht" ist nicht genau richtig. Was ich (und andere) sagen sollten "Laufen mit Administratorrechten". Wenn die Benutzerkontensteuerung deaktiviert ist, wird sie einfach ausgeführt, während sie als lokaler Administrator angemeldet ist, jedoch nicht explizit die Vertrauensstufe verringert, wie z. B. bei Runas. Wenn die Benutzerkontensteuerung aktiviert ist, bedeutet dies, dass der Benutzer in einer Eingabeaufforderung mit erhöhten Rechten ausgeführt wird.
zumalifeguard
2
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)
Totonga
quelle
2
Problem hierbei ist, dass Sie prüfen, ob der Benutzer über Administratorrechte verfügt. Das Batch-Skript kann jedoch ohne Administratorrechte ausgeführt werden.
Tanascius
2
Plus whoamiwird in Windows XP nicht unterstützt.
Mythosofechelon
Auch whoami / groups hat einen Randfall, in dem Sie die falschen Informationen erhalten. Siehe stackoverflow.com/questions/4051883/…
zumalifeguard
2

Einige Server deaktivieren Dienste, die für den Befehl "Netzsitzung" erforderlich sind. Dies führt dazu, dass bei der Administratorprüfung immer angegeben wird, dass Sie möglicherweise keine Administratorrechte haben.

Dan
quelle
2

Edit: copyitright hat darauf hingewiesen, dass dies unzuverlässig ist. Durch das Genehmigen des Lesezugriffs mit der Benutzerkontensteuerung wird dir erfolgreich. Ich habe ein bisschen mehr Skript, um eine andere Möglichkeit anzubieten, aber es ist nicht schreibgeschützt.

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

Alte Antwort unten

Warnung: unzuverlässig


Aufgrund einer Reihe anderer guter Antworten und der von and31415 angesprochenen Punkte stellte ich fest, dass ich ein Fan von Folgendem bin:

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

Wenige Abhängigkeiten und schnell.

Tyler Szabo
quelle
1
Diese Lösung hat früher für mich funktioniert, aber da ich zum Speicherort navigiert und auf den Ordner zugegriffen habe, für den Sie erhöhte Berechtigungen benötigen, ist der ERRORLEVEL / Exit-Code jetzt immer 0, obwohl das Skript als Standardbenutzer ausgeführt wird.
script'n'code
1

Hinweis: Das Überprüfen mit cacls auf \ system32 \ config \ system schlägt in WOW64 IMMER fehl (z. B. in% systemroot% \ syswow64 \ cmd.exe / 32-Bit-Total Commander), sodass Skripts, die in einer 32-Bit-Shell im 64-Bit-System ausgeführt werden, für immer wiederholt werden ... Besser wäre es, im Prefetch-Verzeichnis nach Rechten zu suchen:

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

Win XP bis 7 getestet, jedoch schlägt es in WinPE wie in Windows 7 install.wim fehl. Es gibt weder ein solches Verzeichnis noch eine solche cacls.exe

Auch in winPE AND wow64 schlägt die Prüfung mit openfiles.exe fehl:

OPENFILES > nul

In Windows 7 wird die Fehlerstufe "1" mit der Information angezeigt, dass "das Zielsystem ein 32-Bit-Betriebssystem sein muss".

Beide Überprüfungen schlagen wahrscheinlich auch in der Wiederherstellungskonsole fehl.

Was in Windows XP - 8 32/64 Bit, in WOW64 und in WinPE funktioniert , sind: Dir-Erstellungstests (WENN der Administrator das bombardierte Windows-Verzeichnis nicht mit Berechtigungen für alle ausgelegt hat ...) und

net session

und

reg add HKLM /F

prüft.

Auch ein weiterer Hinweis in einigen Windows XP-Versionen (und wahrscheinlich auch in anderen Versionen, abhängig vom Basteln des Administrators) in Abhängigkeit von Registrierungseinträgen, die bat / cmd direkt aus dem .vbs-Skript aufrufen, schlägt fehl mit der Information, dass bat / cmd-Dateien mit nichts verknüpft sind ...

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

Das Aufrufen von cmd.exe mit dem Parameter der Datei bat / cmd funktioniert dagegen in Ordnung:

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
user2902818
quelle
1

Buchstäblich Dutzende von Antworten in dieser und in verknüpften Fragen und anderswo bei SE, die alle auf die eine oder andere Weise mangelhaft sind, haben deutlich gezeigt, dass Windows kein zuverlässiges integriertes Konsolendienstprogramm bietet. Es ist also Zeit, Ihre eigenen auszurollen.

Der folgende C-Code, der auf Erkennen basiert, ob das Programm mit vollständigen Administratorrechten ausgeführt wird , funktioniert in Win2k + 1 überall und in allen Fällen (Benutzerkontensteuerung, Domänen, transitive Gruppen ...) - da er dasselbe tut wie das System selbst, wenn es ausgeführt wird prüft Berechtigungen. Es signalisiert das Ergebnis sowohl mit einer Nachricht (die mit einem Schalter stummgeschaltet werden kann) als auch mit einem Exit-Code.

Es muss nur einmal kompiliert werden, dann können Sie es einfach .exeüberall kopieren - es hängt nur von kernel32.dllund ab advapi32.dll(ich habe eine Kopie hochgeladen ).

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 behauptet, die APIs seien XP +, dies ist jedoch falsch. CheckTokenMembership ist 2k + und der andere ist noch älter . Der letzte Link enthält auch eine viel kompliziertere Methode, die selbst in NT funktionieren würde.

ivan_pozdeev
quelle
1

PowerShell jemand?

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
quelle
1

Hier ist noch eine, die du der Liste hinzufügen kannst ;-)

(Versuchen Sie eine Dateierstellung am Systemspeicherort)

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

)

Das MODE CONinitialisiert den Bildschirm neu und unterdrückt alle Texte / Fehler, wenn Sie nicht die Berechtigung haben, an den Systemspeicherort zu schreiben.

script'n'code
quelle
0

Alternative: Verwenden Sie ein externes Dienstprogramm, das für diesen Zweck entwickelt wurde, z. B. IsAdmin.exe (uneingeschränkte Freeware).

Ausstiegscodes:

0 - Aktueller Benutzer nicht Mitglied der Administratorgruppe

1 - Aktuelles Benutzermitglied von Administratoren und ausgeführt erhöht

2 - Aktuelles Benutzermitglied der Administratoren, wird jedoch nicht mit erhöhten Rechten ausgeführt

Bill_Stewart
quelle
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
quelle
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

Ich werde den Code Zeile für Zeile erklären:

@echo off

Benutzer werden mit viel mehr als 1 Zeilen ohne diese verärgert sein.

:start

Punkt, an dem das Programm startet.

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

Legen Sie den Dateinamen des zu erstellenden Verzeichnisses fest.

md \windows\%randname% 2>nul

Erstellt das Verzeichnis am <DL>:\Windows(ersetzen Sie <DL> durch Laufwerksbuchstaben).

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

Wenn die Umgebungsvariable ERRORLEVEL Null ist, wird eine Erfolgsmeldung angezeigt.
Gehen Sie bis zum Ende (fahren Sie nicht weiter fort).

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

Wenn ERRORLEVEL eins ist, geben Sie eine Fehlermeldung ein und fahren Sie bis zum Ende fort.

goto start

Falls der Dateiname bereits vorhanden ist, erstellen Sie den Ordner neu (andernfalls lässt der goto endBefehl dies nicht zu).

:end

Geben Sie den Endpunkt an

rd \windows\%randname% 2>nul

Entfernen Sie das erstellte Verzeichnis.

pause >nul

Halten Sie an, damit der Benutzer die Nachricht sehen kann.

Hinweis : Die >nulund 2>nulfiltern die Ausgabe dieser Befehle.

EKons
quelle
Ja, ich weiß, dass Sie immer erhöht sind, wenn Sie als Administrator angemeldet sind (kein Benutzer mit Administratorkontotyp), aber das ist kein Fehler!
EKons
0

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

Ketzer
quelle
Dies scheint falsch zu sein, es zeigt, ob ein Benutzer Administratorrechte hat, aber dies hängt nicht mit der Frage zusammen, ob die aktuelle cmd.exe mit Administratorrechten ausgeführt wird
jeb
Nein, es zeigt an, ob die aktuelle cmd.exe Administratorzugriff auf die Benutzerdatenbank hat oder nicht. Sie funktioniert also auch dann, wenn "net session" dies nicht tut. Alternativ erledigt "net config> nul 2> & 1 && echo admin || echo not admin" den Job. Beide Konstruktionen wurden unter Windows XP unter Gast-, Hauptbenutzer- und Verwaltungskonten erfolgreich getestet, wobei LanmanServer gestoppt wurde (Fehlerstufe 2 für cmd.exe wird unter Gast- und Hauptbenutzer ausgeführt, Fehlerstufe 0 für cmd.exe unter Administratorrechten). Wird es in Vista und später mit den oben genannten UAC-Problemen funktionieren - ich weiß es nicht, also wäre es schön, wenn jemand es testen könnte.
Ketzer
2
Ich habe mit zwei cmd-Fenstern (win7x64) getestet und mit und ohne Administratorrechte begonnen. In beiden Fällen zeigt esadmin
jeb
0

Ich denke, der einfachste Weg ist der Versuch, das Systemdatum zu ändern (für das Administratorrechte erforderlich sind):

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

Wenn die %date%Variable den Wochentag enthalten kann, rufen Sie einfach das Datum des letzten Teils von abDATE Befehls ab:

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
quelle
3
Ich kann nicht anders, als solch einen destruktiven "Rat" abzulehnen.
ivan_pozdeev
2
Selbst wenn Sie die sich ändernde Systemzeit ohne guten Grund außer Acht lassen, schießen Sie sich in den Fuß (alle möglichen seltsamen Auswirkungen auf die Software). Wenn Sie die aktuelle Zeit verwenden, verzerren Sie sie immer noch, wenn der Befehl ausgeführt wird.
ivan_pozdeev
2
@ivan_pozdeev: Vielleicht könnten Sie nur einen der "seltsamen Effekte auf Software" beschreiben, die auftreten können, wenn das Datum in einer cmd.exe-Sitzung auf das gleiche Datum geändert wird ...
Aacini
1
Siehe auch superuser.com/questions/27263/...
ivan_pozdeev
@ivan_pozdeev: Keiner Ihrer Links hat auch nur einen entfernten Bezug zu meiner Methode. Ich denke, Sie haben meine Lösung falsch verstanden. Diese Methode kann nur eines von zwei möglichen Ergebnissen haben: Es wird nichts geändert (wenn der Benutzer keine Administratorrechte hat) oder das DATUM wird auf den gleichen Wert geändert (wenn der Benutzer Administratorrechte hat). Meine Methode ändert die Zeit nicht ! Ich lade Sie ein, meine Antwort noch einmal zu lesen und die Gründe für Ihre Ablehnung im Klartext zu erklären ...:(
Aacini
0

Ich habe einen Benutzer gefunden, der verwenden kann net session , obwohl er kein Administrator ist. Ich habe nicht untersucht warum. Meine Problemumgehung besteht darin, zu testen, ob der Benutzer einen Ordner im Windows-Ordner erstellen kann.

Hier ist mein Code:

::::::: :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
quelle
0

Eine Sammlung der vier scheinbar kompatibelsten Methoden dieser Seite. Der erste ist wirklich ziemlich genial. Getestet ab XP. Verwirrend, dass kein Standardbefehl verfügbar ist, um nach Administratorrechten zu suchen. Ich denke, sie konzentrieren sich jetzt einfach auf PowerShell, was für die meisten meiner eigenen Arbeiten wirklich nutzlos ist.

Ich habe den Stapel 'exit-if-not-admin.cmd' genannt, der von anderen Stapeln aufgerufen werden kann, um sicherzustellen, dass sie nicht weiter ausgeführt werden, wenn die erforderlichen Administratorrechte nicht angegeben sind.

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```
aufsteigende Bälle
quelle
-1

Hier ist mein 2-Cent-Wert:

Ich brauchte einen Stapel, um in einer Domänenumgebung während des Benutzeranmeldevorgangs in einer Arbeitsraumumgebung ausgeführt zu werden, in der Benutzer eine "Sperr" -Richtlinie und eine eingeschränkte Ansicht einhalten (hauptsächlich über Gruppenrichtlinienobjektsätze verteilt).

Ein Domänen-Gruppenrichtlinienobjektsatz wird angewendet, bevor ein mit AD-Benutzern verknüpftes Anmeldeskript erstellt wird. Das Erstellen eines Gruppenrichtlinienobjekt-Anmeldeskripts war zu ausgereift, da das "neue" Benutzerprofil nicht rechtzeitig erstellt / geladen / oder bereit war, ein "Entfernen und / oder" anzuwenden Pin "Taskleiste und Startmenü Elemente vbscript + einige lokale Dateien hinzufügen.

Beispiel: Für die vorgeschlagene Profilumgebung "Standardbenutzer" ist eine Verknüpfung ".URL" (.lnk) erforderlich, die im "% ProgramData% \ Microsoft \ Windows \ Startmenü \ Programme * MyNewOWA.url *" und "C:" Unter anderem \ Users \ Public \ Desktop \ * MyNewOWA.url * "

Die Benutzer haben mehrere Computer in der Domäne, auf denen nur diese festgelegten "Workroom" -PCs diese Richtlinien benötigen.

Diese Ordner erfordern 'Admin'-Rechte zum Ändern, und obwohl der' Domain User 'Teil der lokalen' Admin'-Gruppe ist, war die Benutzerkontensteuerung die nächste Herausforderung.

Verschiedene Anpassungen gefunden und hier zusammengeführt. Ich habe auch einige Benutzer mit BYOD-Geräten, für die andere Dateien mit Perm-Problemen erforderlich sind. Habe noch nicht auf XP getestet (ein etwas zu altes Betriebssystem), aber der Code ist vorhanden, würde gerne Feedback geben.

    :: ------------------------------------------------------------------------
    :: 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

Domänen-PCs sollten so weit wie möglich von Gruppenrichtlinienobjekten gesteuert werden. Arbeitsgruppen- / Standalone-Computer können von diesem Skript gesteuert werden.

Denken Sie daran, dass bei einem BYOD-Arbeitsgruppen-PC mindestens einmal eine UAC-Eingabeaufforderung angezeigt wird (sobald die erste Erhöhung auf "Administratorrechte" erforderlich ist). Da jedoch die lokale Sicherheitsrichtlinie ab diesem Zeitpunkt für die Verwendung durch den Administrator geändert wird, wird die Popups verschwinden.

Auf einem Domänen-PC sollte die Gruppenrichtlinienobjektrichtlinie "ConsentPromptBehaviorAdmin" in Ihrer bereits erstellten "Sperr" -Richtlinie festgelegt sein - wie im Abschnitt "REFERENZEN" des Skripts erläutert.

Führen Sie erneut den Import von secedit.exe der Standarddatei '.inf' aus, wenn Sie in der gesamten Debatte "Zur Benutzerkontensteuerung oder nicht zur Benutzerkontensteuerung" stecken bleiben :-).

Übrigens: @boileau Überprüfen Sie Ihren Fehler auf:

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

Wenn Sie nur "% SYSTEMROOT% \ system32 \ cacls.exe" oder "% SYSTEMROOT% \ system32 \ config \ system" oder beides an der Eingabeaufforderung ausführen - erhöht oder nicht, überprüfen Sie das Ergebnis auf der ganzen Linie.

Ian Stockdale
quelle
-2

Ein anderer Weg, dies zu tun.

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
quelle
Was soll dieser Link sein? Wegen des Links als Spam gekennzeichnet.
mmgross
Überprüfen Sie diese Antwort auf einen Code, der automatisch überprüft und dazu auffordert: stackoverflow.com/a/30590134/4932683
cyberponk