禁用“开始”菜单中的所有电源选项

时间:2015-06-09 09:42:29

标签: c++ winapi registry

我正在开发一个类似于自助服务终端的应用程序。应用程序启动后,它会创建一个新桌面,并使用一个键组合,我可以在桌面之间来回移动。

这个新创建的桌面需要具有有限的功能。为此,我使用了RegCreateKeyExRegSetValueEx函数来创建或修改任务管理器更改密码的注册表项, 锁定关闭用户切换注销。我已使用以下代码从HKEY_CURRENT_USERHKEY_LOCAL_MACHINE两个位置停用了注销:

bool RegistryUtilities::changeSingleFeature(HKEY regKey, LPCWSTR subKey, DWORD value, LPCWSTR valueName)
{
    bool resultOk = false;
    HKEY hkey;
    DWORD dwDisposition;
    if (RegCreateKeyEx(regKey, subKey, 0, NULL, 0, KEY_WRITE, NULL, &hkey, &dwDisposition) == ERROR_SUCCESS) {
        if (RegSetValueEx(hkey, valueName, 0, REG_DWORD, (PBYTE)&value, sizeof(DWORD)) == ERROR_SUCCESS){
            resultOk = true;
        }
        RegCloseKey(hkey);
    }
    return resultOk;
}

bool RegistryUtilities::changeAllFeatures(DWORD value)
{
    bool resultOk = true;

    /// Task Manager
    HKEY regKey = HKEY_CURRENT_USER;
    LPCWSTR subKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
    LPCWSTR valueName = L"DisableTaskMgr";
    if (changeSingleFeature(regKey, subKey, value, valueName) == false)
        resultOk = false;

    /// Change Password
    valueName = L"DisableChangePassword";
    if (changeSingleFeature(regKey, subKey, value, valueName) == false)
        resultOk = false;

    /// Lock
    valueName = L"DisableLockWorkstation";
    if (changeSingleFeature(regKey, subKey, value, valueName) == false)
        resultOk = false;

    /// Log Off
    subKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer";
    valueName = L"NoLogOff";
    if (changeSingleFeature(regKey, subKey, value, valueName) == false)
        resultOk = false;

    /// Shut Down
    valueName = L"NoClose";
    if (changeSingleFeature(regKey, subKey, value, valueName) == false)
        resultOk = false;

    /// User Switching
    regKey = HKEY_LOCAL_MACHINE;
    subKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
    valueName = L"HideFastUserSwitching";
    if (changeSingleFeature(regKey, subKey, value, valueName) == false)
        resultOk = false;

    return resultOk;
}

即使禁用所有这些选项,开始菜单上的“注销”选项仍然可见并且正常工作。在 CTRL + ALT + DEL 菜单中,一切都被禁用,只有一个取消选项存在,正如我想要的那样。

好奇心,在changeAllFeatures函数中我改变了调用changeSingleFeature的顺序,从调用注销选项开始,我不是惊讶地发现,在 CTRL + ALT + DEL 菜单中,所有内容仍然处于禁用状态,但在“开始”菜单中,注销已禁用,但每个其他选项都被禁用(关机,切换用户,锁定等已启用并正常工作。

是否可以禁用所有这些选项,包括注销?

1 个答案:

答案 0 :(得分:0)

我已尝试过多种方法来做到这一点,我认为这是不可能的。我尝试过winapi代码(如帖子中所示),我尝试过直接注册表编辑(使用regedit)和组策略,但似乎没有任何效果。我已经得出结论(我的猜测,我不确定)这是Windows上的安全功能,因为如果您能够删除所有电源选项并登录/注销您无法正常关闭,例如,如果发生电源故障,您将无法访问您的电脑,通过桌面登录,因为这将被禁用