Script batch: comment vérifier les droits d'administrateur


281

Comment vérifier si le script de commandes actuel a des droits d'administrateur?

Je sais comment le faire appeler lui-même avec des runas mais pas comment vérifier les droits d'administrateur. Les seules solutions que j'ai vues sont des tâches de piratage grossières ou l'utilisation de programmes externes. Eh bien, en fait, je ne me soucie pas si c'est un travail de piratage tant qu'il fonctionne sur Windows XP et plus récent.


2
après avoir modifié la droite: [Comment demander l'accès administrateur dans un fichier batch] [1] [1]: stackoverflow.com/questions/1894967/…
Alban



Réponses:


466

Problèmes

La solution de blak3r / Rushyo fonctionne très bien pour tout sauf Windows 8. L'exécution ATsur Windows 8 se traduit par:

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

The request is not supported.

(voir capture d'écran n ° 1) et reviendra %errorLevel% 1.

 

Recherche

Donc, je suis allé chercher d'autres commandes qui nécessitent des autorisations élevées. rationallyparanoid.com en avait une liste, j'ai donc exécuté chaque commande sur les deux extrémités opposées des systèmes d'exploitation Windows actuels (XP et 8) dans l'espoir de trouver une commande qui se verrait refuser l'accès sur les deux systèmes d'exploitation lorsqu'elle est exécutée avec des autorisations standard.

Finalement, j'en ai trouvé un - NET SESSION. Une vraie solution, propre et universelle qui n'implique pas:

  • la création ou l'interaction de données dans des emplacements sécurisés
  • analyse des données renvoyées par les FORboucles
  • recherche de chaînes pour "Administrateur"
  • en utilisant AT(Windows 8 incompatible) ou WHOAMI(Windows XP incompatible).

Chacun d'eux a ses propres problèmes de sécurité, de convivialité et de portabilité.

 

Essai

J'ai indépendamment confirmé que cela fonctionne sur:

  • 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

(voir capture d'écran n ° 2)

 

Mise en œuvre / utilisation

Donc, pour utiliser cette solution, faites simplement quelque chose comme ceci:

@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

Disponible ici, si vous êtes paresseux: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

 

Explication

NET SESSIONest une commande standard utilisée pour "gérer les connexions aux ordinateurs du serveur. Utilisée sans paramètres, [elle] affiche des informations sur toutes les sessions avec l'ordinateur local."

Voici donc le processus de base de mon implémentation donnée:

  1. @echo off
    • Désactiver l'affichage des commandes
  2. goto check_Permissions
    • Aller au :check_Permissionsbloc de code
  3. net session >nul 2>&1
    • Exécuter la commande
    • Masquer la sortie visuelle de la commande par
      1. Rediriger le STDOUTflux de sortie standard (poignée numérique 1 / ) versnul
      2. Rediriger le flux de sortie d'erreur standard (poignée numérique 2 / STDERR) vers la même destination que la poignée numérique 1
  4. if %errorLevel% == 0
    • Si la valeur du code de sortie ( %errorLevel%) est 0 alors cela signifie qu'aucune erreur ne s'est produite et, par conséquent, la commande précédente immédiate s'est exécutée avec succès
  5. else
    • Si la valeur du code de sortie ( %errorLevel%) n'est pas, 0 cela signifie que des erreurs se sont produites et, par conséquent, la commande précédente immédiate s'est exécutée sans succès
  6. Le code entre les parenthèses respectives sera exécuté en fonction des critères remplis

 

Captures d'écran

Windows 8AT %errorLevel% :

[imgur]

 

NET SESSIONsous Windows XP x86 - Windows 8 x64 :

[imgur]

 

Merci, @Tilka, d'avoir changé votre réponse acceptée par la mienne. :)


13
+1 Travail génial! Bonne recherche. Votre message devrait mériter d'être une nouvelle réponse acceptée.
blak3r

13
Cette solution fonctionne normalement très bien, mais si le service "Serveur" (LanmanServer) est arrêté, le code d'erreur pour "Le service serveur n'a pas été démarré" est le même code d'erreur que vous obtenez pour "L'accès est refusé", ce qui entraîne un faux négatif . En d'autres termes, il existe des cas où vous pouvez exécuter cette vérification avec des privilèges administratifs et elle renverra la même erreur que si elle ne disposait pas de ces privilèges.
Lectrode

3
@Lectrode J'ai publié une solution alternative qui n'a pas le même problème: stackoverflow.com/questions/4051883/…
and31415

8
Ce code renvoie un faux positif (au moins sur Windows 7) si l'utilisateur est un utilisateur avec pouvoir. Un utilisateur expérimenté peut également «élever» puis s'exécuter net sessionavec succès (ERRORLEVEL = 0) - mais il n'a pas de droits d'administrateur. L'utilisation openfiles(voir la réponse de Lucretius ci-dessous) n'a pas ce problème.
EM0

1
Cela suspend l'invite si le périphérique réseau ne fonctionne pas complètement (par exemple: débogage Windows). fltmc> nul 2> & 1 fonctionne mieux à cet égard.
kevinf

80

La solution d'Anders a fonctionné pour moi, mais je ne savais pas comment l'inverser pour obtenir le contraire (lorsque vous n'étiez pas administrateur).

Voici ma solution. Il a deux cas, un cas IF et ELSE, et un art ascii pour s'assurer que les gens le lisent réellement. :)

Version minimale

Rushyo a posté cette solution ici: Comment détecter si CMD fonctionne en tant qu'administrateur / a des privilèges élevés?

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

Version qui ajoute des messages d'erreur, des pauses et des sorties

@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

Fonctionne sur WinXP -> Win8 (y compris les versions 32/64 bits).

EDIT: 28/08/2012 Mise à jour pour prendre en charge Windows 8. @BenHooper l'a souligné dans sa réponse ci-dessous. Veuillez voter pour sa réponse.


1
ATne fonctionne pas sur Windows 8, mais j'ai trouvé une meilleure solution. Je l'ai posté comme réponse ici, en fait: stackoverflow.com/questions/4051883/… (ou vous pouvez simplement faire défiler vers le bas, peu importe).
mythofechelon

1
Je me demande si deux lignes de si% errorLevel% == / EQU sur le premier bloc de code est un TYPO .. veuillez corriger.
Ujjwal Singh

@UjjwalSingh C'était sûr. Merci d'avoir attrapé. Je l'ai mis à jour.
blak3r

Pourriez-vous remplacer le "Rushyo a posté cette solution ici" par votre commentaire à mon sujet maintenant que vous utilisez ma solution? :)
mythofechelon

Ne fonctionne pas pour le groupe d'administrateurs de domaine ajouté au groupe d'administrateurs sur la machine locale et se connecte avec l'utilisateur administrateur de domaine.
MCRohith

46

Plus de problèmes

Comme indiqué par @Lectrode, si vous essayez d'exécuter la net sessioncommande alors que le service serveur est arrêté, vous recevez le message d'erreur suivant:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

Dans ce cas, la %errorLevel%variable sera définie sur 2.

Remarque Le service serveur n'est pas démarré en mode sans échec (avec ou sans réseau).

Vous cherchez une alternative

Quelque chose que:

  • peut être exécuté hors de la boîte sur Windows XP et versions ultérieures (32 et 64 bits);
  • ne touche pas le registre ni aucun fichier / dossier système;
  • fonctionne indépendamment des paramètres régionaux du système;
  • donne des résultats corrects même en mode sans échec.

J'ai donc démarré une machine virtuelle Windows XP vanille et j'ai commencé à faire défiler la liste des applications dans le C:\Windows\System32dossier, en essayant de trouver des idées. Après les essais et les erreurs, voici l'approche sale (jeu de mots) que j'ai trouvée:

fsutil dirty query %systemdrive% >nul

La fsutil dirtycommande nécessite des droits d'administrateur pour s'exécuter et échouera sinon. %systemdrive%est une variable d'environnement qui renvoie la lettre de lecteur sur laquelle le système d'exploitation est installé. La sortie est redirigée vers nul, donc ignorée. La %errorlevel%variable sera définie 0uniquement sur une exécution réussie.

Voici ce que dit la documentation:

Fsutil sale

Interroge ou définit le bit sale d'un volume. Lorsqu'un bit sale d'un volume est défini, autochk vérifie automatiquement le volume pour les erreurs lors du prochain redémarrage de l'ordinateur.

Syntaxe

fsutil dirty {query | set} <VolumePath>

Paramètres

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.

Remarques

Un bit sale d'un volume indique que le système de fichiers peut être dans un état incohérent. Le bit sale peut être réglé car:

  • Le volume est en ligne et il a des changements remarquables.
  • Des modifications ont été apportées au volume et l'ordinateur a été arrêté avant que les modifications ne soient validées sur le disque.
  • Une corruption a été détectée sur le volume.

Si le bit sale est défini au redémarrage de l'ordinateur, chkdsk s'exécute pour vérifier l'intégrité du système de fichiers et pour tenter de résoudre tout problème avec le volume.

Exemples

Pour interroger le bit sale sur le lecteur C, tapez:

fsutil dirty query C:

De plus amples recherches

Bien que la solution ci-dessus fonctionne à partir de Windows XP, il convient d'ajouter que Windows 2000 et Windows PE (environnement préinstallé) ne sont pas fournis fsutil.exe, nous devons donc recourir à autre chose.

Lors de mes tests précédents, j'ai remarqué que l'exécution de la sfccommande sans aucun paramètre entraînerait:

  • une erreur, si vous ne disposiez pas de privilèges suffisants;
  • une liste des paramètres disponibles et leur utilisation.

C'est-à-dire: pas de paramètres, pas de fête . L'idée est que nous pouvons analyser la sortie et vérifier si nous avons obtenu autre chose qu'une erreur:

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

La sortie d'erreur est d'abord redirigée vers la sortie standard, qui est ensuite redirigée vers la findcommande. À ce stade , nous devons chercher le seul paramètre qui est pris en charge dans toutes les versions de Windows depuis Windows 2000: /SCANNOW. La recherche est insensible à la casse et la sortie est ignorée en la redirigeant vers nul.

Voici un extrait de la documentation:

Sfc

Analyse et vérifie l'intégrité de tous les fichiers système protégés et remplace les versions incorrectes par des versions correctes.

Remarques

Vous devez être connecté en tant que membre du groupe Administrateurs pour exécuter sfc.exe .

Exemple d'utilisation

Voici quelques exemples de collage-exécution:

Windows XP et versions ultérieures

@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

S'applique à

  • Windows 2000
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE

1
+1 Excellentes solutions. La solution SFC en particulier semble être une vérification fiable pour tous les systèmes d'exploitation en question. Si je rencontre des problèmes en utilisant l'un ou l'autre, je les signalerai ici.
Lectrode

1
Pour ceux qui cherchent à utiliser le SFCchèque pour tous les systèmes, vous devez être un peu créatif. Pour une raison quelconque, commencer avec Windows 8 ne SFCproduit que des caractères uniques. Pour analyser correctement la sortie, vous devez effectuer les opérations suivantes: 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 lignes distinctes). Cela devrait fonctionner sur Windows 2000 à Windows 2012 R2. D'un autre côté, je préfère FINDSTR car il traite généralement les choses plus rapidement que FIND.
Lectrode

Excellent travail, @ and31415! Je n'ai pas encore personnellement testé votre fsutilsolution mais, d'après ce que je peux voir, elle semble beaucoup plus flexible que ma solution. Bien que pas aussi élégant, peut-être. ;) Je suis heureux de voir qu'entre nous, nous obtenons une excellente solution de détection d'administrateur, simple et flexible. :)
mythofechelon

1
Lorsque vous exécutez FSUTIL, vous pouvez laisser de côté la lettre de lecteur et l'exécuter uniquement fsutil dirty query >nullorsque cela est élevé, cela renvoie du texte d'aide et% errorlevel% = 0
SS64

4
@ ss64 Windows 10 ne renvoie plus un niveau d'erreur non nul pour fsutil dirty query >nul, mais fsutil dirty query %systemdrive% >nulfonctionne toujours
bcrist

19

deux autres façons - rapide et rétrocompatible.

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

fltmc La commande est disponible sur tous les systèmes Windows depuis XP, donc cela devrait être assez portable.


Une solution plus vraiment rapide testé sur XP, 8.1, 7 - il y a une variable spécifique =::qui est présenté uniquement si la session de la console n'a pas administrateur privileges.As il est pas si facile de créer variable qui contient =dans son nom c'est une façon relativement fiable pour vérifier admin autorisation (il n'appelle pas d'exécutables externes donc il fonctionne bien)

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

Si vous souhaitez l'utiliser directement via la ligne de commande, mais pas à partir d'un fichier de commandes, vous pouvez utiliser:

set ^"|find "::"||echo has admin permissions

Epic ... La solution set "dv == ::" a-t-elle des inconvénients / limitations?
script'n'code

Eh bien, pour une raison quelconque, le! Dv! La méthode indique toujours que je suis administrateur, alors que je n'ai pas cliqué avec le bouton droit sur "Exécuter en tant qu'administrateur" le fichier de commandes (Windows 10). Je pensais vraiment que cette méthode était parfaite. J'ai adoré cette méthode car elle ne dépend pas de programmes externes. Maintenant, je suis triste et je ne sais pas ce qui fait que cela échoue / n'est pas fiable pour moi :(
script'n'code

1
@copyitright - Je n'avais pas de machine win10 pour le tester là-bas :(. Bien que l'existence d'une =::variable soit plutôt un bug - elle représente un lecteur inexistant, donc elle a probablement été corrigée dans win10.
npocmaka

Ils l'ont probablement corrigé oui. Ce fut agréable le temps que ça a duré.
script'n'code

1
Je vois qu'il =::est défini pour les CMD non administrateur sur Windows 10 1709. Quoi qu'il en soit, ce n'est pas un moyen fiable, vous pouvez facilement le forcer à être défini même sur les sessions CMD d'administration:subst :: c:\ & for %a in (::) do %a & set,
sst

17
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)

1
Il semble que dans certains cas, le test a toujours échoué, même après avoir été élevé. Dans mon cas, lorsque le script a été appelé par mon application.
boileau

15

solution alternative:

@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

7
Pourriez-vous ajouter une explication à votre réponse?
bjb568

4
Bien que ce code puisse répondre à la question, vous devez ajouter quelques explications sur la raison pour laquelle il le fait.
PlasmaHH

2
Oui! Cela fonctionne correctement même lorsque l'utilisateur est un utilisateur avancé (contrairement à la "session nette"). Il n'y a cependant pas besoin de pushd / popd. Il suffit de lancer openfileset de vérifier ERRORLEVEL.
EM0

2
J'utilise cette solution et ça marche bien. Le problème est que openfiles.execela ne fonctionne pas dans WinPE, donc le script retournera toujours que l'utilisateur n'est pas administrateur.
Wayfarer

La documentation pour openfiles.exe se trouve sur technet.microsoft.com/de-de/library/bb490961.aspx . 1>et 2>&1sont expliqués sur microsoft.com/resources/documentation/windows/xp/all/proddocs/… . nulfait référence au périphérique nul
user1460043

13

Non seulement vérifiez, mais OBTENEZ automatiquement les droits d'administrateur
aka Automatic UAC for Win 7/8 / 8.1 ff.
: Ce qui suit est vraiment cool avec une autre fonctionnalité: Cet extrait de lot vérifie non seulement les droits d'administrateur, mais les obtient automatiquement! (et tests avant, si vous utilisez un système d'exploitation compatible UAC.)

Avec cette astuce, vous n'avez pas besoin de plus de temps pour cliquer avec le bouton droit sur votre fichier de commandes "avec les droits d'administrateur". Si vous avez oublié, pour le démarrer avec des droits élevés, UAC apparaît automatiquement! De plus, au début, il est testé, si le système d'exploitation a besoin / fournit l'UAC, il se comporte donc correctement, par exemple pour Win 2000 / XP jusqu'à Win 8.1 - testé.

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

L'extrait fusionne quelques bons modèles de lots, en particulier (1) le test d'administration dans ce fil par Ben Hooper et (2) l'activation UAC lue sur BatchGotAdmin et citée sur le site de lots par robvanderwoude (respect). (3) Pour l'identification du système d'exploitation par "VER | FINDSTR pattern", je ne trouve tout simplement pas la référence.)

(Concernant certaines restrictions très mineures, lorsque "NET SESSION" ne fonctionne pas comme mentionné dans une autre réponse, n'hésitez pas à insérer une autre de ces commandes. - pour certains administrateurs, ils le sont peut-être.)


C'est bien! Notez une chose - l'appeler à partir de Visual Basic fonctionne comme start- il ouvre le script dans une nouvelle fenêtre. Si vous voulez voir les résultats - ajoutez un pauseà la fin de votre script. De plus, il est difficile de détecter quand nous «restons» élevés et quand il y a une répétition. Vous pouvez utiliser un argument de ligne de commande pour cela: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…
Tomasz Gandor

@Philm: que se passe-t-il si l'UAC demande à l'utilisateur d'entrer son mot de passe? Je suppose que ce code ne leur donnera pas automatiquement les droits d'administrateur sans que l'utilisateur n'entre d'abord son mot de passe ;-)
script'n'code

@copyitright. Non bien sûr que non. Mais si un mot de passe nécessaire ou non n'est pas une différence ici: ce que je voulais dire par "automatiquement", c'est bien sûr que le script déclenche automatiquement Windows pour demander les droits, pas plus. Sans une construction comme celle-ci, le script de commandes échouerait s'il était démarré par double-clic ou similaire. Pour éviter cela, l'utilisateur devrait savoir à l'avance que le script nécessite des droits élevés et devait le démarrer comme ça.
Philm

Mon script permet donc simplement à l'auteur d'un fichier batch de décaler le moment d'élévation nécessaire à un point de l'exécution batch qu'il souhaite. Ou en d'autres termes: pour permettre une exécution plus pratique par un "double-clic" normal. Parce que je considérais ces fichiers batch normalement utilisés par des professionnels ou des utilisateurs ayant une très bonne connaissance de la technologie Windows sous-jacente, je n'ai pas expliqué cela en détail.
Philm

12

J'ai deux façons de vérifier l'accès privilégié, les deux sont assez fiables et très portables sur presque toutes les versions de Windows.

1. Méthode

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

C'est l'une des méthodes les plus fiables, en raison de sa simplicité, et le comportement de cette commande très primitive est très peu susceptible de changer. Ce n'est pas le cas des autres outils CLI intégrés comme la session net qui peut être désactivée par les stratégies d'administration / réseau, ou des commandes comme fsutils qui ont changé la sortie sur Windows 10.

* Fonctionne sur XP et versions ultérieures

2. Méthode

REG ADD HKLM /F>nul 2>&1

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

Parfois, vous n'aimez pas l'idée de toucher le disque de l'utilisateur, même si cela est aussi inoffensif que l'utilisation de fsutils ou la création d'un dossier vide, n'est pas prouvable mais cela peut entraîner une défaillance catastrophique en cas de problème. Dans ce scénario, vous pouvez simplement vérifier le Registre pour les privilèges.

Pour cela, vous pouvez essayer de créer une clé sur HKEY_LOCAL_MACHINE en utilisant les autorisations par défaut, vous obtiendrez l' accès refusé et le ERRORLEVEL == 1, mais si vous exécutez en tant qu'administrateur, il affichera "commande exécutée avec succès" etERRORLEVEL == 0 . Étant donné que la clé existe déjà, elle n'a aucun effet sur le registre. C'est probablement le moyen le plus rapide, et le REG est là depuis longtemps.

* Ce n'est pas disponible sur pré NT (Win 9X).

* Fonctionne sur XP et versions ultérieures


Exemple de travail

Un script qui efface le dossier temporaire


1
J'aime vraiment la méthode du registre. Je peux m'en souvenir, je n'ai pas besoin de le chercher chaque fois que je l'utilise.
Miscreant

8

Dans le script batch Elevate.cmd (voir ce lien ), que j'ai écrit pour obtenir les droits d'administrateur , je l'ai fait de la manière suivante:

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

Ceci est testé pour Windows 7, 8, 8.1, 10 et même Windows XP et ne nécessite aucune ressource telle qu'un répertoire spécial, un fichier ou une clé de registre.


6

La façon la plus simple de vérifier les privilèges d'administrateur à l'aide d'un script CMD, que j'ai trouvée, est quelque chose comme ceci:

@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

Cette méthode utilise uniquement les modules internes CMD.exe, elle devrait donc être très rapide. Il vérifie également les capacités réelles du processus plutôt que de rechercher les SID ou les appartenances aux groupes, de sorte que l' autorisation effective est testée. Et cela fonctionne aussi loin que Windows 2003 et XP. Les processus utilisateur normaux ou les processus sans niveau échouent à la sonde d'annuaire, où en tant qu'administrateur ou les processus élevés réussissent.


1
copyitright a souligné que ce n'est pas fiable. Si vous visitez% windir% \ system32 \ config \ systemprofile dans une fenêtre de l'Explorateur et que vous approuvez avec UAC, la fenêtre CMD peut diriger le contenu avec succès. Vous amenant à penser que vous avez une élévation alors que vous n'en avez pas.
Tyler Szabo

5

Ce qui suit essaie de créer un fichier dans le répertoire Windows. S'il réussit, il le supprimera.

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

Notez que 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 est un GUID qui a été généré aujourd'hui et il est supposé improbable d'entrer en conflit avec un nom de fichier existant.


+1 car la réponse acceptée a provoqué l'ouverture infinie de fenêtres de commandes lorsque le script a été appelé depuis mon application.
boileau

was generated today and it is assumed to be improbable to conflict with an existing filename.sauf si deux personnes utilisent ce code
Vitim.us

4

Les whoami / groupes ne fonctionnent pas dans un cas. Si vous avez totalement désactivé l'UAC (pas seulement la notification désactivée), et que vous êtes parti d'une invite d'administrateur , puis avez émis:

runas /trustlevel:0x20000 cmd

vous exécuterez non élevé, mais en émettant:

whoami /groups

dira que vous êtes élevé. C'est faux. Voici pourquoi c'est faux:

Lors de l'exécution dans cet état, si IsUserAdmin ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389(v=vs.85).aspx ) renvoie FALSE et UAC est entièrement désactivé et GetTokenInformation renvoie TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx ), le processus ne fonctionne pas de manière élevée, mais le whoami /groupsprétend.

vraiment, la meilleure façon de le faire à partir d'un fichier batch est:

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

Vous devriez le faire net sessiondeux fois parce que si quelqu'un a fait une atmain avant, vous obtiendrez des informations erronées.


whoami /groupsne fournit pas de fausses informations. C'est juste que cela runas /trustlevelvous place dans un endroit inattendu: courir sans privilèges d'administrateur mais avec un niveau d'intégrité élevé. Vous pouvez le confirmer avec Process Explorer. (Cela peut être un bogue dansrunas mais ce n'est pas le cas whoami.)
Harry Johnston

Harry, j'entends ce que vous dites, mais pouvez-vous nous en dire plus? Je ne comprends pas le commentaire concernant runas /trustlevel Lorsque vous êtes un administrateur local et que l'UAC est désactivé, émettre cette commande runas à partir d'une invite d'administration vous mettra dans un contexte de sécurité "utilisateur de base". Dans ce mode, vous ne pouvez pas effectuer d'opérations d'administration. Essayez "net session", ou fsutil "ou tout autre utilitaire qui nécessite un accès administrateur. Cependant," whoami / groups "vous indique que vous êtes élevé. Si vous ne l'êtes pas. Le fait que l'appel à GetTokenInformation renvoie" TokenElevationTypeDefault "l'indique.
zumalifeguard

Je ne suis pas sûr de comprendre ce que vous entendez par "whoami / groupes vous dit que vous êtes élevé"; il ne produit pas littéralement la chaîne "vous êtes élevé", n'est-ce pas? Quelle partie de la production de whoami / groupes regardez-vous?
Harry Johnston

Harry, je vois que je n'étais pas clair. Premier historique, donc vous et moi sommes sur la même longueur d'onde. il existe une poignée de trucs que les gens utilisent pour déterminer si une invite de commande s'exécute actuellement dans un état disposant d'un accès administrateur. Les techniques courantes consistent à utiliser la commande intégrée telle que fsutil, at, whoami et "net session". L'utilisation de "at" est déconseillée. Si vous effectuez une recherche sur cette page, vous verrez des exemples utilisant fsutil, whoami et "net session". Voir ici pour plus d'exemples de whoami: stackoverflow.com/questions/7985755/…
zumalifeguard

En outre, l'utilisation de l'expression «en cours d'exécution élevé» n'est pas exactement correcte. Ce que je (et d'autres) devrais dire "courir avec des privilèges d'administrateur". Si l'UAC est désactivé, cela s'exécute simplement lorsque vous êtes connecté en tant qu'administrateur local, mais pas de niveau de confiance explicitement réduit, comme avec les runas. Lorsque l'UAC est activé, cela signifie que l'utilisateur s'exécute dans une invite élevée.
zumalifeguard

2
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)

2
Le problème ici est que vous vérifiez si l'utilisateur a des droits d'administrateur. Mais le script batch peut s'exécuter sans droits d'administrateur.
tanascius

2
De plus whoamin'est pas pris en charge dans Windows XP.
mythofechelon

Aussi whoami / groups a un cas de bord où vous obtenez les mauvaises informations. Voir stackoverflow.com/questions/4051883/…
zumalifeguard

2

Certains serveurs désactivent les services requis par la commande "net session". Il en résulte que la vérification de l'administrateur indique toujours que vous ne disposez pas des droits d'administrateur lorsque vous en avez.


2

Edit: copyitright a souligné que ce n'est pas fiable. L'approbation de l'accès en lecture avec UAC permettra à dir de réussir. J'ai un peu plus de script pour offrir une autre possibilité, mais ce n'est pas en lecture seule.

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

Ancienne réponse ci-dessous

Avertissement: peu fiable


Sur la base d'un certain nombre d'autres bonnes réponses ici et de points soulevés par and31415, j'ai constaté que je suis un fan des éléments suivants:

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

Peu de dépendances et rapide.


1
Cette solution fonctionnait pour moi mais depuis que j'ai navigué jusqu'à l'emplacement et accédé au dossier pour lequel vous avez besoin de privilèges élevés, le code ERRORLEVEL / exit est toujours 0 maintenant, malgré l'exécution du script en tant qu'utilisateur standard.
script'n'code

1

Remarque: La vérification avec cacls de \ system32 \ config \ system échouera TOUJOURS dans WOW64, (par exemple à partir de% systemroot% \ syswow64 \ cmd.exe / 32 bits Total Commander) afin que les scripts qui s'exécutent dans un shell 32 bits dans un système 64 bits soient bouclés pour toujours ... Mieux vaut vérifier les droits sur le répertoire Prefetch:

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

Win XP à 7 testé, mais il échoue dans WinPE comme dans Windows 7 install.wim il n'y a pas de tel dir ni cacls.exe

Également dans winPE ET wow64 échoue la vérification avec openfiles.exe:

OPENFILES > nul

Dans Windows 7, le niveau d'erreur sera "1" avec des informations indiquant que "le système cible doit être un système d'exploitation 32 bits".

La vérification échouera probablement également dans la console de récupération.

Ce qui fonctionne dans Windows XP - 8 32/64 bits, dans WOW64 et dans WinPE, ce sont: les tests de création de répertoires (si l'administrateur n'a pas tapis le répertoire Windows bombardé avec des autorisations pour tout le monde ...) et

net session

et

reg add HKLM /F

chèques.

De plus, une note de plus dans certaines fenêtres XP (et d'autres versions probablement aussi, selon le bricolage de l'administrateur) en fonction des entrées de registre appelant directement bat / cmd à partir du script .vbs échouera avec des informations selon lesquelles les fichiers bat / cmd ne sont associés à rien ...

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

En revanche, appeler cmd.exe avec le paramètre du fichier bat / cmd fonctionne correctement:

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

1

Des dizaines de réponses dans cette question et des questions connexes et ailleurs dans SE, qui sont toutes déficientes de cette manière ou d'une autre, ont clairement montré que Windows ne fournit pas un utilitaire de console intégré fiable. Il est donc temps de déployer le vôtre.

Le code C suivant, basé sur Détecter si le programme s'exécute avec les droits d'administrateur complets , fonctionne dans Win2k + 1 , n'importe où et dans tous les cas (UAC, domaines, groupes transitifs ...) - car il fait la même chose que le système lui-même lorsqu'il vérifie les autorisations. Il signale le résultat à la fois avec un message (qui peut être désactivé avec un interrupteur) et un code de sortie.

Il ne doit être compilé qu'une seule fois, alors vous pouvez simplement copier le .exepartout - cela ne dépend kernel32.dllque de advapi32.dll(j'ai téléchargé une copie ).

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 prétend que les API sont XP + mais c'est faux. CheckTokenMembership est 2k + et l'autre est encore plus ancien . Le dernier lien contient également un moyen beaucoup plus compliqué qui fonctionnerait même dans NT.


1

PowerShell quelqu'un?

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

1

En voici un autre à ajouter à la liste ;-)

(essayez de créer un fichier à l'emplacement du système)

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

)

Le MODE CONréinitialise l'écran et supprime tout texte / erreur lorsqu'il n'est pas autorisé à écrire dans l'emplacement système.


0

Alternative: utilisez un utilitaire externe conçu à cet effet, par exemple IsAdmin.exe (logiciel gratuit sans restriction).

Codes de sortie:

0 - L'utilisateur actuel n'est pas membre du groupe Administrateurs

1 - Membre utilisateur actuel des administrateurs et exécutant élevé

2 - Membre utilisateur actuel des administrateurs, mais ne fonctionnant pas avec des droits élevés


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

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

Je vais expliquer le code ligne par ligne:

@echo off

Les utilisateurs seront ennuyés par plus de 1 lignes sans cela.

:start

Point où le programme démarre.

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

Définissez le nom de fichier du répertoire à créer.

md \windows\%randname% 2>nul

Crée le répertoire <DL>:\Windows(remplacez <DL> par une lettre de lecteur).

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

Si la variable d'environnement ERRORLEVEL est nulle, le message de réussite d'écho.
Allez à la fin (ne poursuivez pas).

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

Si ERRORLEVEL en est un, faites écho au message d'échec et passez à la fin.

goto start

Dans le cas où le nom de fichier existe déjà, recréez le dossier (sinon la goto endcommande ne laissera pas cela s'exécuter).

:end

Spécifiez le point d'arrivée

rd \windows\%randname% 2>nul

Supprimez le répertoire créé.

pause >nul

Faites une pause pour que l'utilisateur puisse voir le message.

Remarque : Les >nulet 2>nulfiltrent la sortie de ces commandes.


Oui, je sais que lorsque vous êtes connecté en tant qu'administrateur (pas un utilisateur avec un type de compte administrateur), vous serez toujours élevé, mais ce n'est pas un bug!
EKons

0

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


Cela semble être faux, cela montre si un utilisateur a des droits d'administrateur, mais cela n'est pas lié à la question de savoir si le cmd.exe actuel est exécuté avec des droits d'administrateur
jeb

Non, il montre si l'actuel cmd.exe a un accès administratif à la base de données des utilisateurs ou non, il fonctionne donc même dans le cas où la "session réseau" ne le fait pas. alternativement, "net config> nul 2> & 1 && echo admin || echo not admin" fait le travail. Les deux constructions ont été testées avec succès sur windows xp sous les comptes invité, utilisateur avec pouvoir et administrateur avec LanmanServer arrêté (niveau d'erreur 2 pour cmd.exe exécuté sous invité et utilisateur avec pouvoir, niveau d'erreur 0 pour cmd.exe sous droits d'administrateur). Cela fonctionnera-t-il dans Vista et plus tard avec les problèmes UAC susmentionnés - je ne sais pas, donc ce serait bien si quelqu'un pouvait le tester.
hérétique

2
J'ai testé avec deux fenêtres cmd (win7x64), commencé avec et sans droits d'administrateur. Dans les deux cas, cela montreadmin
jeb

0

Je pense que la manière la plus simple est d'essayer de changer la date du système (qui nécessite des droits d'administrateur):

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

Si la %date%variable peut inclure le jour de la semaine, obtenez simplement la date de la dernière partie de la DATEcommande:

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

3
Je ne peux pas m'empêcher de voter contre un "conseil" aussi destructeur.
ivan_pozdeev

2
Même en laissant de côté cette modification de l'heure du système sans raison valable, vous vous tirez une balle dans le pied (toutes sortes d'effets étranges sur le logiciel) - si vous utilisez l'heure actuelle, vous l'inclinez toujours au moment de l'exécution de la commande.
ivan_pozdeev

2
@ivan_pozdeev: Peut-être pourriez-vous décrire un seul des "effets étranges sur les logiciels" qui peuvent se produire lorsque la date est changée à la même date dans une session cmd.exe ...
Aacini


@ivan_pozdeev: Aucun de vos liens n'est même lié à distance à ma méthode. Je pense que vous avez mal compris ma solution. Cette méthode ne peut avoir qu'un ou deux résultats possibles: rien n'est changé (si l'utilisateur n'a pas de droits d'administrateur), ou la DATE est modifiée À LA MÊME VALEUR (si l'utilisateur a des droits d'administrateur). Ma méthode ne change pas l'heure ! Je vous invite à relire ma réponse et à expliquer en :(
langage

0

J'ai trouvé un utilisateur qui peut utiliser net sessionmême s'il n'est pas administrateur. Je n'ai pas cherché pourquoi. Ma solution consiste à tester si l'utilisateur peut créer un dossier dans le dossier Windows.

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

0

Une collection des quatre méthodes apparemment les plus compatibles de cette page. Le premier est vraiment génial. Testé à partir de XP. Confus cependant, il n'y a pas de commande standard disponible pour vérifier les droits d'administrateur. Je suppose qu'ils se concentrent simplement sur PowerShell maintenant, ce qui est vraiment inutile pour la plupart de mon propre travail.

J'ai appelé le lot «exit-if-not-admin.cmd» qui peut être appelé à partir d'autres lots pour s'assurer qu'ils ne continuent pas l'exécution si les droits d'administrateur requis ne sont pas accordés.

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

-1

Voici mes 2 centimes valent:

J'avais besoin d'un lot à exécuter dans un environnement de domaine pendant le processus de connexion utilisateur, dans un environnement de «salle de travail», en voyant les utilisateurs adhérer à une politique de «verrouillage» et à une vue restreinte (principalement distribuée via des ensembles d'objets de stratégie de groupe).

Un ensemble de GPO de domaine est appliqué avant qu'un script de connexion lié à un utilisateur AD La création d'un script de connexion de GPO soit trop permanente car le "nouveau" profil des utilisateurs n'a pas été créé / chargé / ou prêt à temps pour appliquer une "suppression et / ou Épinglez la barre des tâches et les éléments du menu Démarrer vbscript + ajoutez des fichiers locaux.

Par exemple: L'environnement de profil "utilisateur par défaut" proposé nécessite un raccourci ".URL" (.lnk) placé dans le "% ProgramData% \ Microsoft \ Windows \ Menu Démarrer \ Programmes * MyNewOWA.url *", et le "C: Emplacements \ Users \ Public \ Desktop \ * MyNewOWA.url * ", entre autres éléments

Les utilisateurs ont plusieurs machines au sein du domaine, où seuls ces PC «d'atelier» définis nécessitent ces politiques.

Ces dossiers nécessitent des droits "Admin" pour être modifiés, et bien que l '"Utilisateur du domaine" fasse partie du groupe "Admin" local - l'UAC était le prochain défi.

Trouvé diverses adaptations et fusionné ici. J'ai également des utilisateurs avec des appareils BYOD qui nécessitaient d'autres fichiers avec des problèmes de perm. Je n'ai pas testé sur XP (un peu trop vieux un OS), mais le code est présent, j'adorerais revenir en arrière.

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

Les PC de domaine doivent être régis autant que possible par des ensembles de GPO. Les machines de groupe de travail / autonomes peuvent être régies par ce script.

Rappelez-vous, une invite UAC apparaîtra au moins une fois avec un PC de groupe de travail BYOD (dès que la première élévation à «Admin perms» est requise), mais comme la politique de sécurité locale est modifiée pour une utilisation administrative à partir de ce moment, le les pop-ups disparaîtront.

Un PC de domaine doit avoir la stratégie GPO "ConsentPromptBehaviorAdmin" définie dans votre stratégie "Lock-down" "déjà" créée - comme expliqué dans la section "RÉFÉRENCES" du script.

Encore une fois, lancez l'importation secedit.exe du fichier '.inf' par défaut si vous êtes bloqué sur l'ensemble du débat "Vers UAC ou Pas vers UAC" :-).

btw: @boileau Vérifiez votre échec sur:

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

En exécutant uniquement "% SYSTEMROOT% \ system32 \ cacls.exe" ou "% SYSTEMROOT% \ system32 \ config \ system" ou les deux à partir de l'invite de commande - élevé ou non, vérifiez le résultat dans tous les cas.


-2

Une autre façon de procéder.

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

Quel est ce lien censé être? Marqué comme spam en raison du lien.
mmgross

Recherchez dans cette réponse un code qui vérifie et vous invite automatiquement: stackoverflow.com/a/30590134/4932683
cyberponk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.