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:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <Shlwapi.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; char* RegistryTools = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\system"); //--------------------------------------------------------------------------- // Crea una Clave y subclaves de una ruta dada de registro void CreatePathKey(HKEY RootKey, char* PathKey) { HKEY hKey; DWORD lpdwDisposition; int l = lstrlen(PathKey); char* fin = PathKey; do{ if(*fin == '\\' || !*fin){ if(l>1) *fin = 0; if(RegOpenKeyEx(RootKey, PathKey, 0, KEY_CREATE_SUB_KEY, &hKey)){ RegCreateKeyEx(RootKey, PathKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, &lpdwDisposition); RegCloseKey(hKey); } if(l>1) *fin = '\\'; } fin++; } while(l--); } void DisableRegistryTools(bool Val) { HKEY hKey; DWORD Data; if(!RegOpenKeyEx(HKEY_CURRENT_USER, RegistryTools, 0, KEY_SET_VALUE , &hKey)){ if(Val) Data = 1; else Data = 0; RegSetValueEx(hKey, "DisableRegistryTools", 0, REG_DWORD, (BYTE*)&Data, sizeof(DWORD)); RegCloseKey(hKey); } } DWORD ReadDisableRegistryTools() { HKEY hKey; DWORD Data = 0; DWORD lData = 4; if(!RegOpenKeyEx(HKEY_CURRENT_USER, RegistryTools, 0, KEY_READ , &hKey)){ RegQueryValueEx(hKey, "DisableRegistryTools", 0, 0, (BYTE*)&Data, &lData); RegCloseKey(hKey); } return Data; } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { CreatePathKey(HKEY_CURRENT_USER, RegistryTools); CheckBox1->Checked = (0 == ReadDisableRegistryTools()); } //--------------------------------------------------------------------------- void __fastcall TForm1::CheckBox1Click(TObject *Sender) { DisableRegistryTools(!CheckBox1->Checked); CheckBox1->Checked = (0 == ReadDisableRegistryTools()); } //---------------------------------------------------------------------------
PD: Edito para restaurar el archivo adjunto perdido.
Saludos.