Script por lotes: cómo verificar los derechos de administrador

281

¿Cómo verifico si el script por lotes actual tiene derechos de administrador?

Sé cómo hacer que se llame a sí mismo con runas, pero no cómo verificar los derechos de administrador. Las únicas soluciones que he visto son trabajos crudos de pirateo o uso de programas externos. Bueno, en realidad no me importa si es un trabajo de pirateo, siempre y cuando funcione en Windows XP y versiones posteriores.

Flacs
fuente
2
después de que pueda cambiar el derecho: [Cómo solicitar acceso de administrador dentro de un archivo por lotes] [1] [1]: stackoverflow.com/questions/1894967/…
Alban
Ver también: superuser.com/questions/667607/...
ivan_pozdeev

Respuestas:

466

Cuestiones

La solución de blak3r / Rushyo funciona bien para todo excepto Windows 8. La ejecución ATen Windows 8 da como resultado:

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

The request is not supported.

(ver captura de pantalla # 1) y volverá %errorLevel% 1.

 

Investigación

Entonces, busqué otros comandos que requieren permisos elevados. racionallyparanoid.com tenía una lista de algunos, por lo que ejecuté cada comando en los dos extremos opuestos de los sistemas operativos Windows actuales (XP y 8) con la esperanza de encontrar un comando al que se le negaría el acceso en ambos sistemas operativos cuando se ejecuta con permisos estándar.

Finalmente, encontré uno - NET SESSION. Una solución verdadera , limpia y universal que no involucra:

  • la creación o interacción con datos en ubicaciones seguras
  • análisis de datos devueltos de FORbucles
  • buscando cadenas para "Administrador"
  • utilizando AT(Windows 8 incompatible) o WHOAMI(Windows XP incompatible).

Cada uno de ellos tiene sus propios problemas de seguridad, usabilidad y portabilidad.

 

Pruebas

He confirmado independientemente que esto funciona en:

  • 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

(ver captura de pantalla # 2)

 

Implementación / Uso

Entonces, para usar esta solución, simplemente haga algo como esto:

@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 aquí, si eres flojo: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

 

Explicación

NET SESSIONes un comando estándar utilizado para "administrar las conexiones de la computadora del servidor. Usado sin parámetros, [muestra] información sobre todas las sesiones con la computadora local".

Entonces, aquí está el proceso básico de mi implementación dada:

  1. @echo off
    • Deshabilitar la visualización de comandos
  2. goto check_Permissions
    • Salta al :check_Permissionsbloque de código
  3. net session >nul 2>&1
    • Ejecutar comando
    • Ocultar salida visual del comando por
      1. Redireccionar la salida de salida estándar (controlador numérico 1 / STDOUT) anul
      2. Redirigir la secuencia de salida de error estándar (manejador numérico 2 / STDERR) al mismo destino que el manejador numérico 1
  4. if %errorLevel% == 0
    • Si el valor del código de salida ( %errorLevel%) es 0 , esto significa que no se han producido errores y, por lo tanto, el comando anterior inmediato se ejecutó correctamente
  5. else
    • Si el valor del código de salida ( %errorLevel%) no es 0 , esto significa que se han producido errores y, por lo tanto, el comando anterior inmediato se ejecutó sin éxito
  6. El código entre los paréntesis respectivos se ejecutará según los criterios que se cumplan

 

Capturas de pantalla

Windows 8AT %errorLevel% :

[imgur]

 

NET SESSIONen Windows XP x86 - Windows 8 x64 :

[imgur]

 

Gracias, @Tilka, por cambiar tu respuesta aceptada a la mía. :)

mitofechelon
fuente
13
+1 trabajo impresionante! Buena investigacion. Tu publicación debe merecer una nueva respuesta aceptada.
blak3r
13
Esta solución normalmente funciona muy bien, pero si se detiene el servicio "Servidor" (LanmanServer), el código de error para "El servicio del servidor no se ha iniciado" es el mismo código de error que obtiene para "Acceso denegado", lo que da como resultado un falso negativo . En otras palabras, hay casos en los que puede ejecutar esta verificación con privilegios administrativos y devolverá el mismo error que sin esos privilegios.
Lectrode
3
@Lectrode He publicado una solución alternativa que no tiene el mismo problema: stackoverflow.com/questions/4051883/…
y31415
8
Este código devuelve un falso positivo (al menos en Windows 7) si el usuario es un Usuario avanzado. Un usuario avanzado también puede "elevarse" y luego ejecutarse con net sessionéxito (ERRORLEVEL = 0), pero en realidad no tiene derechos de administrador. Usar openfiles(ver la respuesta de Lucrecio a continuación) no tiene este problema.
EM0
1
Esto bloquea el mensaje si el dispositivo de red no funciona completamente (por ejemplo: depuración de Windows). fltmc> nul 2> & 1 funciona mejor en ese sentido.
kevinf
80

La solución de Anders funcionó para mí, pero no estaba seguro de cómo invertirla para obtener lo contrario (cuando no eras un administrador).

Aquí está mi solución. Tiene dos casos, un caso IF y ELSE, y algunas ilustraciones para asegurar que la gente realmente lo lea. :)

Versión mínima

Rushyo publicó esta solución aquí: ¿Cómo detectar si CMD se está ejecutando como Administrador / tiene privilegios elevados?

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

Versión que agrega mensajes de error, pausas y salidas

@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

Funciona en WinXP -> Win8 (incluidas las versiones de 32/64 bits).

EDITAR: 28/08/2012 Actualizado para admitir Windows 8. @BenHooper señaló esto en su respuesta a continuación. Por favor vota su respuesta.

blak3r
fuente
1
ATno funciona en Windows 8, pero he encontrado una mejor solución. Lo publiqué como respuesta aquí, en realidad: stackoverflow.com/questions/4051883/… (o simplemente puede desplazarse hacia abajo, lo que sea).
mythofechelon
1
Me pregunto si dos líneas de si% errorLevel% == / EQU en el primer bloque de código es un TYPO ... corrija.
Ujjwal Singh
@UjjwalSingh Seguro que sí. Gracias por la captura. Lo he actualizado.
blak3r
¿Podría querer reemplazar el "Rushyo publicó esta solución aquí" con su comentario sobre mí ahora que está usando mi solución? :)
mythofechelon
No funciona para el grupo de administradores de dominio agregado al grupo de administradores en la máquina local e inicia sesión con el usuario administrador de dominio.
MCRohith
46

Más problemas

Como señaló @Lectrode, si intenta ejecutar el net sessioncomando mientras el servicio del servidor está detenido, recibirá el siguiente mensaje de error:

The Server service is not started.

More help is available by typing NET HELPMSG 2114

En este caso, la %errorLevel%variable se establecerá en 2.

Nota El servicio del servidor no se inicia mientras está en modo seguro (con o sin conexión de red).

Buscando una alternativa

Algo que:

  • se puede ejecutar de fábrica en Windows XP y versiones posteriores (32 y 64 bits);
  • no toca el registro ni ningún archivo / carpeta del sistema;
  • funciona independientemente de la configuración regional del sistema;
  • da resultados correctos incluso en modo seguro.

Así que inicié una máquina virtual Windows XP de vainilla y comencé a desplazarme por la lista de aplicaciones en la C:\Windows\System32carpeta, intentando obtener algunas ideas. Después de pruebas y errores, este es el enfoque sucio (juego de palabras) que se me ocurrió:

fsutil dirty query %systemdrive% >nul

El fsutil dirtycomando requiere derechos de administrador para ejecutarse y fallará de lo contrario. %systemdrive%es una variable de entorno que devuelve la letra de unidad donde está instalado el sistema operativo. La salida se redirige a nul, por lo tanto, se ignora. La %errorlevel%variable se establecerá 0solo en caso de ejecución exitosa.

Esto es lo que dice la documentación:

Fsutil sucio

Consulta o establece el bit sucio de un volumen. Cuando se establece el bit sucio de un volumen, autochk verifica automáticamente el volumen en busca de errores la próxima vez que se reinicia la computadora.

Sintaxis

fsutil dirty {query | set} <VolumePath>

Parámetros

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.

Observaciones

El bit sucio de un volumen indica que el sistema de archivos puede estar en un estado inconsistente. El bit sucio se puede configurar porque:

  • El volumen está en línea y tiene cambios sobresalientes.
  • Se realizaron cambios en el volumen y la computadora se apagó antes de que los cambios se confirmaran en el disco.
  • Se detectó corrupción en el volumen.

Si el bit sucio se establece cuando la computadora se reinicia, chkdsk se ejecuta para verificar la integridad del sistema de archivos e intentar solucionar cualquier problema con el volumen.

Ejemplos

Para consultar el bit sucio en la unidad C, escriba:

fsutil dirty query C:

Más investigación

Si bien la solución anterior funciona desde Windows XP en adelante, vale la pena agregar que Windows 2000 y Windows PE (entorno preinstalado) no vienen con fsutil.exe , por lo que tenemos que recurrir a otra cosa.

Durante mis pruebas anteriores, noté que ejecutar el sfccomando sin ningún parámetro daría como resultado:

  • un error, si no tuvo suficientes privilegios;
  • Una lista de los parámetros disponibles y su uso.

Es decir: sin parámetros, sin fiesta . La idea es que podamos analizar la salida y verificar si tenemos algo más que un error:

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

La salida del error se redirige primero a la salida estándar, que luego se canaliza al findcomando. En este punto, tenemos que buscar la única parámetro que se admite en todas las versiones de Windows desde Windows 2000: /SCANNOW. La búsqueda no distingue entre mayúsculas y minúsculas, y la salida se descarta redirigiéndola a nul.

Aquí hay un extracto de la documentación:

SFC

Analiza y verifica la integridad de todos los archivos protegidos del sistema y reemplaza las versiones incorrectas por las correctas.

Observaciones

Debe iniciar sesión como miembro del grupo Administradores para ejecutar sfc.exe .

Uso de muestra

Aquí hay algunos ejemplos de pegar y ejecutar:

Windows XP y posterior

@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

Se aplica a

  • Windows 2000
  • Windows XP
  • Windows Vista
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE
y31415
fuente
1
+1 Excelentes soluciones. La solución SFC en particular parece ser una verificación confiable para todos los sistemas operativos en cuestión. Si encuentro algún problema al usar cualquiera de estos, los reportaré aquí.
Lectrode
1
Para cualquiera que quiera usar el SFCcheque para todos los sistemas, debe ser un poco creativo. Por alguna razón, comenzar con Windows 8 SFCsolo genera caracteres individuales. Para analizar con éxito la salida, debe hacer lo siguiente: 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 líneas separadas). Esto debería funcionar en Windows 2000 a través de Windows 2012 R2. En una nota al margen, prefiero FINDSTR porque generalmente procesa las cosas más rápido que FIND.
Lectrode
¡Buen trabajo, @ and31415! Todavía no he probado personalmente su fsutilsolución, pero, por lo que puedo ver, parece mucho más flexible que mi solución. Aunque, no tan elegante, tal vez. ;) Me alegra ver que, entre nosotros, estamos obteniendo una excelente, fácil y flexible solución de detección de administrador fijada. :)
mythofechelon
1
Al ejecutar FSUTIL, puede omitir la letra de la unidad y simplemente ejecutar fsutil dirty query >nulcuando se eleva, esto devuelve texto de ayuda y% errorlevel% = 0
SS64
44
@ ss64 Windows 10 ya no devuelve un nivel de error distinto de cero para fsutil dirty query >nul, sin embargo, fsutil dirty query %systemdrive% >nulaún funciona
bcrist
19

Dos formas más: rápido y compatible con versiones anteriores.

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

fltmc El comando está disponible en todos los sistemas Windows desde XP, por lo que debería ser bastante portátil.


Una de las soluciones más muy rápido probado en XP, 8.1, 7 - hay una variable específica =::que se presenta sólo si la sesión de consola no tiene privileges.As de administración no es tan fácil crear variable que contiene =en su nombre se trata de manera relativamente fiable para comprobar para admin permiso (no llama ejecutables externos, por lo que funciona bien)

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

Si desea usar esto directamente a través de la línea de comando, pero no desde un archivo por lotes, puede usar:

set ^"|find "::"||echo has admin permissions
npocmaka
fuente
Epic ... ¿La solución "dv == ::" establecida tiene inconvenientes / limitaciones?
script'n'code
Bueno, por alguna razón el! Dv! El método siempre dice que soy Administrador, mientras que no he hecho clic derecho en "Ejecutar como Administrador" en el archivo por lotes (Windows 10). Realmente pensé que este método era perfecto. Me encantó este método porque no depende de programas externos. Ahora estoy triste y no sé qué lo está haciendo fallar / poco confiable para mí :(
script'n'code
1
@copyitright - No tenía una máquina win10 para probarlo allí :(. Aunque la existencia de la =::variable es más bien un error - representa una unidad no existente, por lo que probablemente se solucionó en win10.
npocmaka
Probablemente lo hayan parchado sí. Fue divertido mientras duró.
script'n'code
1
Veo que =::está definido para CMD sin administrador en Windows 10 1709. De todos modos, no es una forma confiable, puede forzarlo a que se defina fácilmente incluso en sesiones de CMD de administrador:subst :: c:\ & for %a in (::) do %a & set,
sst
17
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)
Anders
fuente
1
Parece que en algunos casos la prueba siempre falló, incluso después de ser elevada. En mi caso, cuando el script fue llamado por mi aplicación.
boileau
15

solución alternativa:

@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
Lucrecio
fuente
77
¿Podría agregar una explicación a su respuesta?
bjb568
44
Si bien este código puede responder la pregunta, debe agregar alguna explicación sobre por qué lo hace.
PlasmaHH
2
¡Si! Esto funciona correctamente incluso cuando el usuario es un Usuario avanzado (a diferencia de "sesión de red"). Sin embargo, no hay necesidad de pushd / popd. Simplemente ejecutar openfilesy verificar ERRORLEVEL es suficiente.
EM0
2
He estado usando esta solución y ha funcionado bien. El problema es que openfiles.exeno funciona en WinPE, por lo que el script siempre devolverá que el usuario no es administrador.
Caminante
La documentación para openfiles.exe se puede encontrar en technet.microsoft.com/de-de/library/bb490961.aspx . 1>y 2>&1se explican en microsoft.com/resources/documentation/windows/xp/all/proddocs/… . nulse refiere al dispositivo nulo
usuario1460043
13

No solo comprueba sino que OBTENES derechos de administrador automáticamente,
también conocido como Automatic UAC for Win 7/8 / 8.1 ff.
: Lo siguiente es realmente genial con una característica más: este fragmento de lote no solo verifica los derechos de administrador, ¡sino que los obtiene automáticamente! (y prueba antes, si vive en un sistema operativo compatible con UAC).

Con este truco, no necesita más tiempo para hacer clic derecho en su archivo por lotes "con derechos de administrador". Si lo ha olvidado, para comenzar con derechos elevados, ¡UAC aparece automáticamente! Además, al principio se prueba, si el sistema operativo necesita / proporciona UAC, por lo que se comporta correctamente, por ejemplo, para Win 2000 / XP hasta que se pruebe Win 8.1.

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


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

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

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

El fragmento combina algunos buenos patrones de lotes, especialmente (1) la prueba de administración en este hilo por Ben Hooper y (2) la activación de UAC leída en BatchGotAdmin y citada en el sitio de lotes por robvanderwoude (respeto). (3) Para la identificación del sistema operativo por "patrón VER | FINDSTR" simplemente no encuentro la referencia).

(Con respecto a algunas restricciones muy pequeñas, cuando "NET SESSION" no funciona como se menciona en otra respuesta, siéntase libre de insertar otro de esos comandos. Para mí, ejecutar en modo seguro de Windows o servicios estándar especiales inactivos y tales no son casos de uso importantes - para algunos administradores tal vez lo sean)

Philm
fuente
¡Esto es genial! Tenga en cuenta una cosa: llamarlo desde Visual Basic funciona así start: abre el script en una nueva ventana. Si desea ver los resultados, agregue un pauseal final de su secuencia de comandos. Además, es difícil de detectar, cuando "nos mantenemos" elevados, y cuando hay una repetición. Puede usar un argumento de línea de comando para eso: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…
Tomasz Gandor
@Philm: ¿Qué sucede si UAC requiere que el usuario ingrese su contraseña? Supongo que este código no les otorgará derechos de administrador automáticamente sin que el usuario ingrese su contraseña primero ;-)
script'n'code
@copyitright. No claro que no. Pero si la contraseña es necesaria o no, no es una diferencia aquí: lo que quise decir con "automáticamente" es, por supuesto, que el script activa a Windows para que PIDA automáticamente los derechos, no más. Sin una construcción como esta, el script por lotes fallaría si se inicia con un doble clic o similar. Para evitar eso, el usuario tendría que saber de antemano que el script requiere derechos elevados y tuvo que iniciarlo así.
Philm
Entonces, mi secuencia de comandos solo permite que el autor de un archivo por lotes cambie el momento de elevación necesaria a un punto durante la ejecución del lote que él o ella desea. O en otras palabras: para permitir una ejecución más conveniente mediante "doble clic" normal. Debido a que consideré dichos archivos por lotes normalmente utilizados por profesionales o usuarios con muy buen conocimiento de la tecnología subyacente de Windows, no lo expliqué en detalle.
Philm
12

Tengo dos formas de verificar el acceso privilegiado, ambas son bastante confiables y muy portátiles en casi todas las versiones de Windows.

1. Método

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

Este es uno de los métodos más confiables, debido a su simplicidad, y es muy poco probable que cambie el comportamiento de este comando tan primitivo. Ese no es el caso de otras herramientas CLI integradas, como la sesión de red, que pueden deshabilitarse mediante políticas de administración / red, o comandos como fsutils que cambiaron la salida en Windows 10.

* Funciona en XP y posterior

2. Método

REG ADD HKLM /F>nul 2>&1

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

A veces no le gusta la idea de tocar el disco del usuario, incluso si es tan inofensivo como usar fsutils o crear una carpeta vacía, no se puede probar, pero puede resultar en una falla catastrófica si algo sale mal. En este escenario, solo puede verificar el registro para obtener privilegios.

Para esto, puede intentar crear una clave en HKEY_LOCAL_MACHINE utilizando los permisos predeterminados, obtendrá Acceso denegado y ERRORLEVEL == 1, pero si se ejecuta como Administrador, imprimirá "comando ejecutado con éxito" y ERRORLEVEL == 0. Como la clave ya existe, no tiene ningún efecto en el registro. Esta es probablemente la forma más rápida, y el REG está allí durante mucho tiempo.

* No está disponible en pre NT (Win 9X).

* Funciona en XP y posterior


Ejemplo de trabajo

Un script que borra la carpeta temporal

Vitim.us
fuente
1
Realmente me gusta el método de registro. Realmente puedo recordarlo, no tengo que buscarlo cada vez que lo uso.
Malhechor el
8

En el script por lotes Elevate.cmd (vea este enlace ), que he escrito para obtener derechos de administrador , lo he hecho de la siguiente manera:

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

Esto se prueba para Windows 7, 8, 8.1, 10 e incluso Windows XP y no necesita ningún recurso, como un directorio especial, un archivo o una clave de registro.

Mate
fuente
6

La forma más limpia de verificar los privilegios de administrador usando un script CMD, que he encontrado, es algo como esto:

@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

Este método solo usa CMD.exe incorporado, por lo que debería ser muy rápido. También verifica las capacidades reales del proceso en lugar de verificar los SID o las pertenencias a grupos, por lo que se prueba el permiso efectivo . Y esto funciona desde Windows 2003 y XP. Los procesos de usuario normales o los procesos no elevados fallan en la sonda de directorio, donde como administrador o procesos elevados tienen éxito.

Guillermo
fuente
1
copyitright señaló que esto no es confiable. Si visita% windir% \ system32 \ config \ systemprofile en una ventana del Explorador y aprueba con UAC, la ventana CMD puede dirigir correctamente el contenido. Llevándote a pensar que tienes elevación cuando no la tienes.
Tyler Szabo
5

Lo siguiente intenta crear un archivo en el directorio de Windows. Si tiene éxito, lo eliminará.

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

Tenga en cuenta que 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 es un GUID que se generó hoy y se supone que es improbable que entre en conflicto con un nombre de archivo existente.

Benoit
fuente
+1 porque la respuesta aceptada provocó que se abrieran infinitas ventanas de comandos cuando se llamó al script desde mi aplicación.
boileau
was generated today and it is assumed to be improbable to conflict with an existing filename.excepto si dos personas usan este código
Vitim.us
4

El whoami / groups no funciona en un caso. Si tiene el UAC totalmente desactivado (no solo la notificación desactivada), y comenzó desde un mensaje del Administrador y luego emitió:

runas /trustlevel:0x20000 cmd

ejecutará no elevado, pero emitirá:

whoami /groups

dirá que estás elevado. Está incorrecto. He aquí por qué está mal:

Cuando se ejecuta en este estado, si IsUserAdmin ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389(v=vs.85).aspx ) devuelve FALSE y UAC está completamente desactivado, y GetTokenInformation devuelve TokenElevationTypeDefault ( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a-securable-object-in-windows-vista.aspx ), entonces el proceso no se ejecuta elevado, pero whoami /groupsafirma que sí.

Realmente, la mejor manera de hacer esto desde un archivo por lotes es:

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

Debería hacerlo net sessiondos veces porque si alguien lo hizo de atantemano, obtendrá la información incorrecta.

zumalifeguard
fuente
whoami /groupsno está proporcionando la información incorrecta. Es solo que lo runas /trustlevelcoloca en un lugar inesperado: ejecutar sin privilegios de administrador pero con un alto nivel de integridad. Puede confirmar esto con Process Explorer. (Esto puede ser un error runaspero no es un error whoami).
Harry Johnston
Harry, escucho lo que dices, pero ¿puedes explicar esto? No entiendo el comentario con respecto a runas /trustlevel Cuando eres un administrador local y UAC está deshabilitado, emitir ese comando runas desde un indicador de administrador te colocará en un contexto de seguridad de "usuario básico". Mientras está en ese modo, no puede realizar operaciones administrativas. Intente "net session", o fsutil "o cualquier otra utilidad que requiera acceso de administrador. Sin embargo," whoami / groups "le dice que está elevado. Cuando no lo está. El hecho de llamar a GetTokenInformation devuelve" TokenElevationTypeDefault "lo indica.
zumalifeguard
No estoy seguro de entender lo que quieres decir con "whoami / groups te dice que estás elevado"; literalmente no genera la cadena "estás elevado", ¿verdad? ¿Qué parte de la producción de whoami / grupos estás viendo?
Harry Johnston
Harry, veo que no estaba claro. Primer fondo, así que tú y yo estamos en la misma página. Existen algunos trucos que las personas usan para determinar si un símbolo del sistema se está ejecutando actualmente en un estado que tiene acceso de administrador. Las técnicas comunes son usar el comando integrado como fsutil, at, whoami y "net session". El uso de "at" está en desuso. Si busca en esta página, verá ejemplos usando fsutil, whoami y "net session". Vea aquí más ejemplos de whoami: stackoverflow.com/questions/7985755/…
zumalifeguard
Además, usar la frase "correr elevado" no es exactamente correcto. Lo que yo (y otros) debería decir "ejecutar con privilegios de administrador". Si UAC está desactivado, simplemente se ejecuta mientras está conectado como administrador local, pero no se reduce explícitamente el nivel de confianza, como con las runas. Cuando UAC está habilitado, esto significa que el usuario se está ejecutando en una solicitud elevada.
zumalifeguard
2
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)
Totonga
fuente
2
El problema aquí es que verifica si el usuario tiene derechos de administrador. Pero el script por lotes podría ejecutarse sin derechos de administrador.
tanascius
2
Plus whoamino es compatible con Windows XP.
mythofechelon
También whoami / groups tiene un caso límite donde obtienes la información incorrecta. Ver stackoverflow.com/questions/4051883/…
zumalifeguard
2

Algunos servidores deshabilitan los servicios que requiere el comando "sesión neta". Esto da como resultado que la verificación del administrador siempre diga que no tiene derechos de administrador cuando pueda tenerlos.

Dan
fuente
2

Editar: copyitright ha señalado que esto no es confiable. Aprobar el acceso de lectura con UAC permitirá que dir tenga éxito. Tengo un poco más de script para ofrecer otra posibilidad, pero no es de solo lectura.

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

Respuesta anterior a continuación

Advertencia: poco confiable


Basado en una serie de otras buenas respuestas aquí y en los puntos planteados por and31415, descubrí que soy fanático de lo siguiente:

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

Pocas dependencias y rápido.

Tyler Szabo
fuente
1
Esta solución solía funcionar para mí, pero como he navegado hasta la ubicación y accedido a la carpeta para la que necesita privilegios elevados, el código ERRORLEVEL / exit siempre es 0 ahora, a pesar de ejecutar el script como usuario estándar.
script'n'code
1

Nota: Verificar con cacls para \ system32 \ config \ system SIEMPRE fallará en WOW64 (por ejemplo, de% systemroot% \ syswow64 \ cmd.exe / 32 bit Total Commander) para que los scripts que se ejecutan en el shell de 32 bits en el sistema de 64 bits se repitan para siempre ... Mejor sería verificar los derechos en el directorio Prefetch:

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

Win XP a 7 probado, sin embargo, falla en WinPE como en Windows 7 install.wim no existe tal dir ni cacls.exe

También en winPE Y wow64 falla verificar con openfiles.exe:

OPENFILES > nul

En Windows 7, el nivel de error será "1" con información de que "el sistema de destino debe ser un sistema operativo de 32 bits"

Es probable que ambas comprobaciones también fallen en la consola de recuperación.

Lo que funciona en Windows XP - 8 32/64 bit, en WOW64 y en WinPE son: pruebas de creación de directorios (SI el administrador no bombardeó el directorio de Windows con permisos para todos ...) y

net session

y

reg add HKLM /F

cheques.

También una nota más en algunas ventanas XP (y otras versiones probablemente también, dependiendo de los ajustes del administrador) dependiendo de las entradas del registro que llaman directamente a bat / cmd desde el script .vbs fallará con información de que los archivos bat / cmd no están asociados con nada ...

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

Llamar a cmd.exe con el parámetro del archivo bat / cmd por otro lado funciona bien:

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
usuario2902818
fuente
1

Literalmente, docenas de respuestas en este y preguntas vinculadas y en otros lugares de SE, todas las cuales son deficientes de esta manera u otra, han demostrado claramente que Windows no proporciona una utilidad de consola incorporada confiable. Por lo tanto, es hora de lanzar el tuyo.

El siguiente código C, basado en Detectar si el programa se ejecuta con todos los derechos de administrador , funciona en Win2k + 1 , en cualquier lugar y en todos los casos (UAC, dominios, grupos transitivos ...), porque hace lo mismo que el sistema en sí cuando Verifica los permisos. Señala el resultado tanto con un mensaje (que puede silenciarse con un interruptor) como con el código de salida.

Solo necesita compilarse una vez, luego puede copiarlo en .exetodas partes, solo depende de kernel32.dlly advapi32.dll(he subido una copia ).

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 afirma que las API son XP + pero esto es falso. CheckTokenMembership es 2k + y el otro es aún mayor . El último enlace también contiene una forma mucho más complicada que funcionaría incluso en NT.

ivan_pozdeev
fuente
1

PowerShell alguien?

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

Aquí hay otro para agregar a la lista ;-)

(intente crear un archivo en la ubicación del sistema)

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

)

El MODE CONreinicializa la pantalla y surpresses cualquier texto / errores al no tener el permiso para escribir en la ubicación del sistema.

script'n'code
fuente
0

Alternativa: utilice una utilidad externa diseñada para este propósito, por ejemplo, IsAdmin.exe (software gratuito sin restricciones).

Códigos de salida:

0: el usuario actual no es miembro del grupo de administradores

1 - Usuario actual miembro de Administradores y ejecutado elevado

2 - Usuario actual miembro de Administradores, pero no se ejecuta elevado

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

Explicaré el código línea por línea:

@echo off

Los usuarios se molestarán con muchas más de 1 líneas sin esto.

:start

Punto donde comienza el programa.

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

Establezca el nombre de archivo del directorio que se creará.

md \windows\%randname% 2>nul

Crea el directorio en <DL>:\Windows(reemplazar <DL> con letra de unidad).

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

Si la variable de entorno ERRORLEVEL es cero, entonces eco mensaje de éxito.
Ve al final (no continúes más).

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

Si ERRORLEVEL es uno, repita el mensaje de falla y vaya al final.

goto start

En caso de que el nombre de archivo ya exista, goto endvuelva a crear la carpeta (de lo contrario, el comando no permitirá que esto se ejecute).

:end

Especifique el punto final

rd \windows\%randname% 2>nul

Eliminar el directorio creado.

pause >nul

Pausa para que el usuario pueda ver el mensaje.

Nota : Los >nuly 2>nulestán filtrando la salida de estos comandos.

EKons
fuente
Sí, sé que cuando inicies sesión como usuario Administrador (no un usuario con un tipo de cuenta de administrador) siempre estarás elevado, ¡pero eso no es un error!
EKons
0

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

hereje
fuente
Esto parece estar mal, muestra si un usuario tiene derechos de administrador, pero esto no está relacionado con la pregunta si el cmd.exe actual se ejecuta con derechos de administrador
jeb
no, muestra si cmd.exe actual tiene acceso administrativo a la base de datos de usuarios o no, por lo que funciona incluso en el caso en que "net session" no lo tiene. alternativamente, "net config> nul 2> & 1 && echo admin || echo not admin" hace el trabajo. Ambas construcciones se probaron con éxito en Windows XP bajo cuentas de invitado, usuario avanzado y administrativas con LanmanServer detenido (errorlevel 2 para cmd.exe ejecutado bajo invitado y usuario avanzado, errorlevel 0 para cmd.exe bajo derechos de administrador). ¿Funcionará en Vista y más tarde con los problemas de UAC mencionados anteriormente? No lo sé, por lo que sería bueno si alguien pudiera probarlo.
hereje
2
Probé con dos ventanas de cmd (win7x64), comencé con y sin derechos de administrador. En ambos casos se notaadmin
jeb
0

Creo que la forma más simple es tratar de cambiar la fecha del sistema (que requiere derechos de administrador):

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

Si la %date%variable puede incluir el día de la semana, solo obtenga la fecha de la última parte del DATEcomando:

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
fuente
3
No puedo evitar menospreciar un "consejo" tan destructivo.
ivan_pozdeev
2
Incluso dejando de lado que cambiar el tiempo del sistema sin una buena razón es dispararse en el pie (todo tipo de efectos extraños en el software): si está usando la hora actual, todavía está sesgada para cuando se ejecuta el comando.
ivan_pozdeev
2
@ivan_pozdeev: Quizás podría describir uno solo de los "efectos extraños en el software" que pueden ocurrir cuando la fecha se cambia a la misma fecha en una sesión cmd.exe ...
Aacini
1
También vea superuser.com/questions/27263/...
ivan_pozdeev
@ivan_pozdeev: Ninguno de sus enlaces está ni remotamente relacionado con mi método. Creo que entendiste mal mi solución. Este método solo puede tener uno de dos resultados posibles: nada cambia (si el usuario no tiene derechos de administrador), o la FECHA cambia al MISMO VALOR (si el usuario tiene derechos de administrador). ¡Mi método NO CAMBIA EL TIEMPO! Los invito a releer mi respuesta y explicar en inglés las razones de su :(
voto negativo
0

Encontré un usuario que puede usar net sessionaunque no sea administrador. No busqué por qué. Mi solución es probar si el usuario puede crear una carpeta en la carpeta de Windows.

Aquí está mi código:

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

Una colección de los cuatro métodos aparentemente más compatibles de esta página. El primero es realmente bastante genio. Probado desde XP arriba. Sin embargo, es confuso que no haya un comando estándar disponible para verificar los derechos de administrador. Supongo que simplemente se están centrando en PowerShell ahora, lo que es realmente inútil para la mayoría de mi propio trabajo.

Llamé al lote 'exit-if-not-admin.cmd' que se puede llamar desde otros lotes para asegurarme de que no continúen la ejecución si no se otorgan los derechos de administrador necesarios.

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```
bolas ascendentes
fuente
-1

Aquí está mi valor de 2 centavos:

Necesitaba un lote para ejecutar dentro de un entorno de Dominio durante el proceso de inicio de sesión del usuario, dentro de un entorno de 'sala de trabajo', viendo a los usuarios adherirse a una política de "bloqueo" y vista restringida (distribuida principalmente a través de conjuntos de GPO).

Un conjunto de GPO de dominio se aplica antes de un script de inicio de sesión vinculado al usuario de AD. La creación de un script de inicio de sesión de GPO era demasiado permanente ya que el perfil "nuevo" de los usuarios no se había creado / cargado / o estaba listo a tiempo para aplicar un "eliminar y / o Anclar "barra de tareas y elementos del menú Inicio vbscript + agregar algunos archivos locales.

por ejemplo: El entorno de perfil propuesto para el 'usuario predeterminado' requiere un acceso directo ".URL" (.lnk) ubicado dentro del "% ProgramData% \ Microsoft \ Windows \ Start Menu \ Programs * MyNewOWA.url *", y el "C: \ Users \ Public \ Desktop \ * MyNewOWA.url * "ubicaciones, entre otros elementos

Los usuarios tienen varias máquinas dentro del dominio, donde solo estas PC de 'sala de trabajo' requieren estas políticas.

Estas carpetas requieren derechos de 'Administrador' para modificar, y aunque el 'Usuario de dominio' es parte del grupo local 'Administrador', el siguiente desafío fue UAC.

Encontramos varias adaptaciones y amalgamamos aquí. También tengo algunos usuarios con dispositivos BYOD que requieren otros archivos con problemas permanentes. No he probado en XP (un sistema operativo demasiado viejo), pero el código está presente, me encantaría retroalimentar.

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

Las PC de dominio deben regirse lo más posible por los conjuntos de GPO. Las máquinas de grupo de trabajo / autónomas pueden regirse por este script.

Recuerde, aparecerá una ventana emergente de UAC al menos una vez con una PC de grupo de trabajo BYOD (tan pronto como se requiera la primera elevación a 'Permisos de administrador'), pero a partir de este momento, la política de seguridad local se modifica para uso administrativo. las ventanas emergentes desaparecerán.

Una PC de dominio debe tener la política "ConsentPromptBehaviorAdmin" de GPO establecida dentro de su política de "bloqueo" ya "creada", como se explica en la sección "REFERENCIAS" del script.

Nuevamente, ejecute la importación secedit.exe del archivo '.inf' predeterminado si está atrapado en todo el debate "A UAC o No a UAC" :-).

por cierto: @boileau Verifique su falla en:

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

Al ejecutar solo "% SYSTEMROOT% \ system32 \ cacls.exe" o "% SYSTEMROOT% \ system32 \ config \ system" o ambos desde el símbolo del sistema - elevado o no, verifique el resultado en todos los ámbitos.

Ian Stockdale
fuente
-2

Otra forma de hacer esto.

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
fuente
¿Qué se supone que es ese enlace? Marcado como spam debido al enlace.
mmgross
Verifique esta respuesta para obtener un código que verifique y solicite automáticamente: stackoverflow.com/a/30590134/4932683
cyberponk