Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

Can I edit gpedit.msc in a program made in C

I want to edit it to disable cmd and the control panel. (I tried to edit it using the registry, but there was no entry.)

What should I do? I use Windows 32 API.

HRESULT hr = S_OK; // Use IGroupPolicyObject to retrieve and modify the registry settings. // for the GPO represented by the gpoInfo.lpDsPath IGroupPolicyObject* p = NULL; hr = CoCreateInstance(CLSID_GroupPolicyObject, NULL, CLSCTX_INPROC_SERVER, IID_IGroupPolicyObject, (LPVOID*)&p); if (SUCCEEDED(hr)) // The GPO value we want to modify is the // User Configuration // +> Policies // +>Administrative Templates // +->System // +->Prevent access to the command prompt DWORD dwSection = GPO_SECTION_USER; HKEY hGPOSectionKey = NULL; DWORD dwData; HKEY hSettingKey; LSTATUS rStatus; hr = 0; //Open the GPO and load its registy values for both: Machine and user hr = p->OpenLocalMachineGPO(GPO_OPEN_LOAD_REGISTRY); // Request the user Registy hive for the GPO hr = p->GetRegistryKey(dwSection, &hGPOSectionKey); // Determine if you want to set it to Not Congigure, // Enabled or Disabled for the GPO itself. // The second call, RequestSetting will provide the "Yes" or "No" // value for setting // the policy as shown by the GPO Editor // iMode // 0=Not Configured, 1=Enabled, 2=Disabled switch (iMode) case 0: // We do not want to configure the GPO, but we don't want to // affect other GPOs on the same key, // so just delete values associated with this // particular GPO setting. rStatus = RegDeleteValue(hGPOSectionKey, L"Software\\Policies\\Microsoft\\Windows\\System\\DisableCMD" rStatus = RegDeleteValue(hGPOSectionKey, L"Software\\Policies\\Microsoft\\Windows\\System\\**del.DisableCMD" break; case 1: // To enable the policy, the DisableCMD value must // exist and the **del.DisableCMD value must not. // lData: // Check to see if the key for this policy exists. // If if it does, retrieve a handle // If not, create it. if (RegOpenKeyEx(hGPOSectionKey, L"Software\\Policies\\Microsoft\\Windows\\System", 0, KEY_WRITE, &hSettingKey) != ERROR_SUCCESS) rStatus = RegCreateKeyEx( hGPOSectionKey, L"Software\\Policies\\Microsoft\\Windows\\System", NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hSettingKey, NULL); // Set the value DisableCMD and allow, disallow // script launching of CMD DWORD lData = 1; rStatus = RegSetValueEx(hSettingKey, L"DisableCMD", NULL, REG_DWORD, (BYTE *)(&lData), sizeof(DWORD)); // Remove the not configured value indicator from the hive. // It may not exist, so the RegDeleteValue may return // and error, this can be ignored. rStatus = RegDeleteValue(hGPOSectionKey, L"Software\\Policies\\Microsoft\\Windows\\System\\**del.DisableCMD" rStatus = RegCloseKey(hSettingKey); break; case 2: // Disable the policy. // must remove the DisableCMD value and add the // **del.DisableCMD value. // Same stesp as before, check to see if the key for this // policy exists, // if not, create it. 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", NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hSettingKey, NULL); bCreate = TRUE; DWORD dwType = 0; DWORD cbType = sizeof(dwData); if (!bCreate) // If we did not create the key, then our value // *may* exist. // try to read it. If we succeed, write that value back // to **del.DisableCMD // if not, then set **del.DisableCMD to 0 rStatus = RegGetValue(hGPOSectionKey, 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 = RegSetValueEx(hSettingKey, L"**del.DisableCMD", NULL, REG_DWORD, (BYTE *)(&dwData), sizeof(DWORD)); // The key was created, just set the **del.DisableCMD // value to 0 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); // Write the GPO back to the directory hr = p->Save( FALSE, TRUE, &RegistryId, &ThisAdminToolGuid); hr = p->Release(); return hr; int main() CoInitialize(NULL); ModifyUserPolicyForPreventAccessToCmdPrompt(1); return 0;

Basically use the Group Policy API to modify specific values in the GPO.

Note: you need to logoff(Press Ctrl+Alt+Del and choose the option to Log off) to take effect after successful compilation.

For more details, please refer: how to modify a registry based policy

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question . Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers .