Jump to content


Photo

DisableRegistryTools


  • Please log in to reply
7 replies to this topic

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 18 October 2014 - 05:55 PM

Seguro que muchas veces nos ha fastidiado un S.O. Windows no profesional en el que hemos querido crear políticas para usuarios y no hemos podido por carecer de gpedit.msc.

El truco que os presento nace de la necesidad que he tenido de bloquear /desbloquear el uso de regedit para un usuario en un Windows no profesional. Muestra como crear una política al usuario activo capaz de negarle el uso de regedit o permitírselo. Sirve tanto en un Windows profesional como en la versión home. Está probado en winXP y Win8.

La forma que muestro de actuar es válida para otro tipo de políticas.

En el caso que describo, la clave del registro involucrada es: SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system
Y el valor para el permiso es DisableRegistryTools  del tipo REG_DWORD y si vale 1, se restringe el uso del regedit.

Con el fin de crear rápidamente todas las claves y subclaves en el registro y poder reutilizar el código, he escrito una función general CreatePathKey

El resto del código muestra como escribir un determinado valor de una clave y como leerlo. En las funciones de manejo del registro no he usado funciones de la librería estándar de C ni de delphi, sólo API, con el fin de poder compilar mini aplicaciones basadas en el código. No uso unicode.

Como viene siendo costumbre en casi todo el código que publico, lo mostraré en C++ y delphi

Lo que sigue es una pequeña aplicación en C++ que tiene un CheckBox para permitir o no el uso de regedit por parte del usuario en curso:


cpp
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4.  
  5. #include "Unit1.h"
  6. #include <Shlwapi.h>
  7.  
  8. //---------------------------------------------------------------------------
  9. #pragma package(smart_init)
  10. #pragma resource "*.dfm"
  11. TForm1 *Form1;
  12.  
  13. char* RegistryTools = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\system");
  14.  
  15. //---------------------------------------------------------------------------
  16. // Crea una Clave y subclaves de una ruta dada de registro
  17. void CreatePathKey(HKEY RootKey, char* PathKey)
  18. {
  19.   HKEY  hKey;
  20.   DWORD lpdwDisposition;
  21.   int l = lstrlen(PathKey);
  22.   char* fin = PathKey;
  23.   do{
  24.     if(*fin == '\\' || !*fin){
  25.       if(l>1) *fin = 0;
  26.       if(RegOpenKeyEx(RootKey, PathKey, 0, KEY_CREATE_SUB_KEY, &hKey)){
  27.         RegCreateKeyEx(RootKey, PathKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
  28.                     0, &hKey, &lpdwDisposition);
  29.         RegCloseKey(hKey);
  30.       }
  31.       if(l>1) *fin = '\\';
  32.     }
  33.     fin++;
  34.   } while(l--);
  35. }
  36.  
  37. void DisableRegistryTools(bool Val)
  38. {
  39.   HKEY  hKey;
  40.   DWORD  Data;
  41.   if(!RegOpenKeyEx(HKEY_CURRENT_USER, RegistryTools, 0, KEY_SET_VALUE , &hKey)){
  42.     if(Val) Data = 1;
  43.     else    Data = 0;
  44.     RegSetValueEx(hKey, "DisableRegistryTools", 0, REG_DWORD, (BYTE*)&Data, sizeof(DWORD));
  45.     RegCloseKey(hKey);
  46.   }
  47. }
  48.  
  49. DWORD ReadDisableRegistryTools()
  50. {
  51.   HKEY  hKey;
  52.   DWORD Data = 0;
  53.   DWORD lData = 4;
  54.   if(!RegOpenKeyEx(HKEY_CURRENT_USER, RegistryTools, 0, KEY_READ , &hKey)){
  55.     RegQueryValueEx(hKey, "DisableRegistryTools", 0, 0, (BYTE*)&Data, &lData);
  56.     RegCloseKey(hKey);
  57.   }
  58.   return Data;
  59. }
  60.  
  61. //---------------------------------------------------------------------------
  62. __fastcall TForm1::TForm1(TComponent* Owner)
  63.         : TForm(Owner)
  64. {
  65.   CreatePathKey(HKEY_CURRENT_USER, RegistryTools);
  66.   CheckBox1->Checked = (0 == ReadDisableRegistryTools());
  67. }
  68.  
  69. //---------------------------------------------------------------------------
  70. void __fastcall TForm1::CheckBox1Click(TObject *Sender)
  71. {
  72.   DisableRegistryTools(!CheckBox1->Checked);
  73.   CheckBox1->Checked = (0 == ReadDisableRegistryTools());
  74. }
  75.  
  76. //---------------------------------------------------------------------------

PD: Edito para restaurar el archivo adjunto perdido.

Saludos.

Attached Files


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 18 October 2014 - 05:56 PM

La misma aplicación escrita en C++ Builder, la expongo ahora en delphi7:




delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     CheckBox1: TCheckBox;
  12.     procedure CheckBox1Click(Sender: TObject);
  13.     procedure FormCreate(Sender: TObject);
  14.   private
  15.     { Private declarations }
  16.   public
  17.     { Public declarations }
  18.   end;
  19.  
  20. var
  21.   Form1: TForm1;
  22.  
  23. implementation
  24.  
  25. {$R *.dfm}
  26. const
  27.   RegistryTools = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system';
  28.  
  29. // Crea una Clave y subclaves de una ruta dada de registro
  30. procedure CreatePathKey(RootKey: HKEY; PathKey: PCHAR);
  31. var
  32.   hKey0: HKEY;
  33.   lpdwDisposition: DWORD;
  34.   SubKey: PCHAR;
  35.   fin, l: integer;
  36. begin
  37.   l:= lstrlen(PathKey);
  38.   SubKey:= VirtualAlloc(0, l+1, MEM_COMMIT, PAGE_READWRITE);
  39.   lstrcpy(SubKey, PathKey);
  40.   fin:= 0;
  41.   repeat
  42.     if (SubKey[fin] = '\') or (SubKey[fin] = #0) then
  43.     begin
  44.       if l > 1 then SubKey[fin]:= #0;
  45.       if RegOpenKeyEx(RootKey, SubKey, 0, KEY_CREATE_SUB_KEY, hKey0)<>ERROR_SUCCESS then
  46.       begin
  47.         RegCreateKeyEx(RootKey, SubKey, 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
  48.                     0, hKey0, @lpdwDisposition);
  49.         RegCloseKey(hKey0);
  50.       end;
  51.     if l > 1 then SubKey[fin]:= '\';
  52.     end;
  53.     inc(fin); dec(l);
  54.   until (l<0);
  55.   VirtualFree(SubKey, 0, MEM_RELEASE);
  56. end;
  57.  
  58. function ReadDisableRegistryTools: DWORD;
  59. var
  60.   hKey0: HKEY;
  61.   lResult: DWORD;
  62. begin
  63.   lResult:= 4;
  64.   Result:= 0;
  65.   if RegOpenKeyEx(HKEY_CURRENT_USER, RegistryTools, 0, KEY_READ, hKey0) = ERROR_SUCCESS then
  66.   begin
  67.     RegQueryValueEx(hKey0, 'DisableRegistryTools', 0, nil, @Result, @lResult);
  68.     RegCloseKey(hKey0);
  69.   end;
  70. end;
  71.  
  72. procedure DisableRegistryTools(Val: boolean);
  73. var
  74.   hKey0: HKEY;
  75.   Data:  DWORD;
  76. begin
  77.   if RegOpenKeyEx(HKEY_CURRENT_USER, RegistryTools, 0, KEY_SET_VALUE, hKey0) = ERROR_SUCCESS then
  78.   begin
  79.     if Val then Data:= 1
  80.     else Data:= 0;
  81.     RegSetValueEx(hKey0, 'DisableRegistryTools', 0, REG_DWORD, @Data, sizeof(DWORD));
  82.     RegCloseKey(hKey0);
  83.   end;
  84. end;
  85.  
  86.  
  87. procedure TForm1.CheckBox1Click(Sender: TObject);
  88. begin
  89.   DisableRegistryTools(not CheckBox1.Checked);
  90.   CheckBox1.Checked:= ReadDisableRegistryTools = 0;
  91. end;
  92.  
  93. procedure TForm1.FormCreate(Sender: TObject);
  94. begin
  95.   CreatePathKey(HKEY_CURRENT_USER, RegistryTools);
  96.   CheckBox1.Checked:= ReadDisableRegistryTools = 0;
  97. end;
  98.  
  99. end.

PD: Edito para restaurar el archivo adjunto perdido.

Saludos.

Attached Files


  • 0

#3 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 566 posts
  • LocationEspaña

Posted 19 October 2014 - 10:18 AM

Una vez más me descubro ante tu sabiduría.  :ap: :ap:

Muchas gracias por el aporte, maestro.

(y)
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 20 October 2014 - 07:53 AM

Excelente truco, gracias por compartirlo amigo. :D

  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 20 October 2014 - 08:45 AM

Interesante la solución :)

Aunque a mi me da cierto recelo mover algo al Registro de Windows  *-)

Saludos


  • 0

#6 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 posts
  • LocationMisiones, Argentina

Posted 20 October 2014 - 11:34 AM

Interesante Escafandra. Como ando en otras cosas bajé el RAR para analizarlo mejor después.
Hace tiempo tuve un lío con el tema de solicitar permisos y todo lo que sea registro en algún momento es útil.
Muchas gracias  (y)

Saludos.
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 20 October 2014 - 02:54 PM

Interesante la solución :)

Aunque a mi me da cierto recelo mover algo al Registro de Windows  *-)

Saludos


Al fin y al cabo es donde se escriben, en este caso, esos permisos. Si escribes donde debes, no hay el más mínimo problema. A mi no me da el más mínimo reparo y me resuelve muchos problemas de todo tipo.  :)

Saludos.
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 20 October 2014 - 07:06 PM

Se agradece el truco amigo.  (y)

Interesante la solución :)

Aunque a mi me da cierto recelo mover algo al Registro de Windows  *-)

Saludos


Más peligroso es borrar o modificar una entrada del Registro.  ;)

Saludos,


  • 0




IP.Board spam blocked by CleanTalk.