En mi última publicación errónea:
/dsadsi/archive/2009/07/23/working-with-group-policy-objects-programmatically-determining-registry-values-to -enable-disable-set-a-specific-policy.aspx
Discutí un método empírico para determinar los valores que uno necesita escribir en el registro para habilitar/deshabilitar/establecer una política de grupo basada en el registro. En esta publicación, proporcionaré una función C++ simple que ilustra cómo escribir la información clave en el GPO.
Por ahora, concentrémonos en el código C++ para modificar el GPO.
La función requiere 3 datos:
ADsPath al objeto GPO a modificar
Valores de control del modo A, 0=No configurado, 1=Activado, 2=Desactivado p>
El valor real a escribir en la clave que representa el valor de control de modo.
A continuación se muestra la fuente de la función. Los comentarios deben proporcionar información sobre cómo funciona el código.
Un punto clave es darse cuenta de que si está modificando un GPO existente que contiene múltiples configuraciones en un árbol de claves de registro específico, no puede simplemente eliminar todo el árbol de claves, debe eliminar solo los valores que afectan las configuraciones que está trabajando con.
Otro problema sutil es la forma en que utiliza los métodos IGroupPolicyObject::GetRegistryKey y IGroupPolicyObject::Save. El indicador activado en GetRegistryKey para indicar que la sección es un valor sin firmar (GPO_SECTION_ROOT o GPO_SECTION_USER o GPO_SECTION_MACHINE. ), la bandera para indicar la sección sobre el método Guardar es un boo
lean (VERDADERO para escribir la configuración de la máquina, FALSO para escribir la configuración del usuario. Cometí el error de usar el mismo valor en ambas ubicaciones y pensé que estaba buscando un error en la interfaz IGroupPolicyObject.
Encontrar). la ruta puede ser un desafío La próxima publicación del blog proporcionará detalles sobre cómo ubicar un objeto GPO en AD basándose en información específica utilizando el modelo de objetos GPMC o la función BrowseForGPO.
A continuación se muestra el código fuente de C++. :
HRESULT ModifyUserPolicyForPreventAccessToCmdPrompt( BSTR bGPOPath, intiMode, DWORD lData)
{
HRESULT hr=S_OK;
// p>
// Utilice IGroupPolicyObject para recuperar y modificar la configuración del registro.
// para el GPO representado por gpoInfo.lpDsPath
//
IGroupPolicyObject* p = NULL;
hr = CoCreateInstance(CLSID_GroupPolicyObject, NULL,
CLSCTX_INPROC_SERVER, IID_IGroupPolicyObject,
(LPVOID*)&p);
if (SUCCEEDED(hr))
{
//
// El valor de GPO que queremos modificar es el
//
// Configuración de Usuario
// +> Políticas
// +>Plantillas Administrativas
// +->Sistema
// +->Evitar el acceso al símbolo del sistema
//
DWORD dwSection = GPO_SECTION_USER;
HKEY hGPOSectionKey = NULL;
DWO
RD dwData;
HKEY hSettingKey;
LSTATUS rStatus;
hr = 0;
//
//Abre el GPO y carga sus valores de registro para ambos: Máquina y usuario
//
hr = p->OpenDSGPO( bGPOPath, GPO_OPEN_LOAD_REGISTRY);
//
// Solicitar el subárbol de registro del usuario para el GPO
//
hr = p->GetRegistryKey(dwSection, &hGPOSectionKey); p>
//
// Determina si quieres configurarlo en No configurar,
// Habilitado o Deshabilitado para el GPO en sí.
//
// La segunda llamada, RequestSetting proporcionará el valor "Sí" o "No"
// para la configuración
// la política como se muestra en el Editor de GPO
//
// iMode
// 0=No configurado, 1=Activado, 2=Desactivado p>
//
cambiar (iMode)
{
caso 0:
//
// No queremos configurar el GPO, pero no queremos
// afectar otros GPO en la misma clave,
// así que simplemente elimine los valores asociado con esta
// configuración de GPO particular.
//
rStatus = RegDeleteValue(hGPOSectionKey,
L"Software \\Policies\ \Microsoft\\Windows\\System\\DisableCMD"
);
rStatus = RegDeleteValue(hGPOSectionKey,
L"Software\\Policies\\Microsoft\\Windows\\System\\**del.DisableCMD"
);
interrupción;
caso 1 :
{
//
// Para habilitar la política, el valor DisableCMD debe
// existir y ** del.DisableCMD el valor no debe.
//
// lData:
//
// Verifique si el La clave para esta política existe
// Si es así, recupere un identificador
// Si no, créelo.
//
if( RegOpenKeyEx( hGPOSectionKey,
L"Software\\Policies\\Microsoft\\Windows\\System", 0,
KEY_WRITE, &hSettingKey) != ERROR_SUCCESS )
{
rStatus = RegCreateKeyEx(
hGPOSectionKey,
L"Software\\Policies\\Microsoft\\Windows\\ Sistema",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL, p> p>
&hSettingKey,
NULL );
}
//
// Establece el valor DisableCMD y permitir, no permitir
// script
t lanzamiento de CMD
//
rStatus = RegSetValueEx(hSettingKey, L"DisableCMD",
NULL, REG_DWORD, (BYTE *)(&lData),
sizeof(DWORD));
//
// Elimina el indicador de valor no configurado de la colmena.
// Puede que no exista, por lo que RegDeleteValue puede devolver
// y un error, esto se puede ignorar.
//
rStatus = RegDeleteValue(hGPOSectionKey,
L"Software\\Policies\\Microsoft\\Windows\\System\\**del.DisableCMD"
);
rStatus = RegCloseKey(hSettingKey );
ruptura;
}
caso 2:
{
//
// Deshabilitar la política.
// debe eliminar el valor DisableCMD y agregar el
// **valor del.DisableCMD.
/ /
// El mismo paso que antes, verifique si la clave para esta
// política existe,
// si no, créela.
//
BOOL bCreate = FALSE;
if( RegOpenKeyEx( hGPOSectionKey, L"Software\\Policies\\Microsoft\\Windows\\System" , 0, KEY_WRITE, &hSettingKey) != ERROR_SUCCESS )
{
rStatus = RegCreateKeyEx(
hGPOSectionKey,
L"Software\\Policies\\Microsoft\\Windows\\System",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_WRITE,
NULL,
&hSettingKey,
NULL );
bCreate = TRUE;
}
DWORD dwType = 0;
DWORD cbType = sizeof( dwData );
if( !bCreate )
{
//
// Si no creamos la clave , entonces nuestro valor
// *puede* existir.
// intenta leerlo. Si tenemos éxito, escribe ese valor nuevamente
// en. **del.DisableCMD
// si no, establezca **del.DisableCMD en 0
//
rStatus = RegGetValue(hGPOSectionKey, p> p>
L"Software\\Policies\\Microsoft\\Windows\\System", L"DisableCMD", RRF_RT_ANY, &dwType, (BYTE *)(&dwData), &cbType);
if ( rStatus != ERROR_SUCCESS ) dwData = 0;
else RegDeleteValue( hSettingKey, L"DisableCMD");
rStatus = RegSetVal
ueEx(hSettingKey, L"**del.DisableCMD", NULL, REG_DWORD, (BYTE *)(&dwData), sizeof(DWORD));
}
else
{
//
// La clave fue creada, simplemente establezca el valor **del.DisableCMD
// en 0 p>
//
dwData = 0;
rStatus = RegSetValueEx(hSettingKey, L"**del.DisableCMD", NULL, REG_DWORD, (BYTE *)(&dwData ), sizeof(DWORD));
}
rStatus = RegCloseKey(hSettingKey);
}
}
GUID RegistryId = REGISTRY_EXTENSION_GUID;
GUID ThisAdminToolGuid =
/*{ CLSID_PolicySnapinUser/* */
{
0x0F6B957E,
0x509E,
0x11D1,
{0xA7, 0xCC, 0x00, 0x00, 0xF8, 0x75, 0x71, 0xE3}
} ;
rStatus = RegCloseKey(hGPOSectionKey);
//
// Escribe el GPO nuevamente en el directorio
//
hr = p->Guardar(
FALSO,
VERDADERO,
&RegistryId,
&ThisAdminToolGuid);
hr = p->Release();
}
return hr;
}