如何在 C# 中设置 REG_KEY_DONT_VIRTUALIZE 标志 [英] how to set REG_KEY_DONT_VIRTUALIZE flag in c#

查看:60
本文介绍了如何在 C# 中设置 REG_KEY_DONT_VIRTUALIZE 标志的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题很简单,但我在谷歌上搜索了很长时间才找到答案.
如何将 REG_KEY_DONT_VIRTUALIZE 标志设置为我创建的注册表项(即 HKLM\Software\MyApp)?我希望我的程序独立于用户.启动我的应用程序的每个用户都应该可以访问位于该位置的相同配置选项).更改应用程序清单 我可以通过以管理员身份运行程序来禁用注册表虚拟化,但我希望普通用户能够运行该程序并读取注册表值.

My question is very simple, but i dint found an answer googling long time.
How to set REG_KEY_DONT_VIRTUALIZE flag to registry key created by me (i.e. HKLM\Software\MyApp)? I want my program to be user-independent. Every user starting my app should have access to the same configuration options located in that location). Changing application manifest I can disable registry virtualization by running program as administrator, but I want normal user be able to run the program and read registry values.

推荐答案

迄今为止,还没有 C# 或 C API 来设置注册表项标志.

To date, there is no C# or C API to set the registry key flags.

我认为最安全的方法是使用 CreateProcess 启动 REG.exe 命令行工具.

I assume the safest way is to launch the REG.exe command line tool using CreateProcess.

但是,作为记录,我已经粘贴了来自这个博客 演示了使用未记录的 API 的另一种方式:

But, for the record, I have pasted some 'C' code from this blog which demonstrates another way using an undocumented API:

typedef enum _CONTROL_FLAGS {
    RegKeyClearFlags = 0,
    RegKeyDontVirtualize = 2,
    RegKeyDontSilentFail = 4,
    RegKeyRecurseFlag = 8
} CONTROL_FLAGS;

typedef struct _KEY_CONTROL_FLAGS_INFORMATION {
    ULONG   ControlFlags;
} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION;

typedef enum _KEY_SET_INFORMATION_CLASS {
    KeyWriteTimeInformation,
    KeyWow64FlagsInformation,
    KeyControlFlagsInformation,
    KeySetVirtualizationInformation,
    KeySetDebugInformation,
    MaxKeySetInfoClass  // MaxKeySetInfoClass should always be the last enum

} KEY_SET_INFORMATION_CLASS;

NTSYSAPI NTSTATUS NTAPI NtSetInformationKey(
IN HANDLE               KeyHandle,
IN KEY_SET_INFORMATION_CLASS InformationClass,
IN PVOID                KeyInformationData,
IN ULONG                DataLength );

typedef NTSYSAPI NTSTATUS (NTAPI* FuncNtSetInformationKey) (
    HANDLE KeyHandle,
    KEY_SET_INFORMATION_CLASS InformationClass,
    PVOID KeyInformationData,
    ULONG DataLength ); 

BOOL CRegLonMigration::SetDontVirtualizeFlag(LPCTSTR keyPath)
{
    FuncNtSetInformationKey ntsik = (FuncNtSetInformationKey)GetProcAddress(GetModuleHandle( _T("ntdll.dll") ), "NtSetInformationKey" ); 
    KEY_CONTROL_FLAGS_INFORMATION kcfi = {0}; 

    kcfi.ControlFlags = RegKeyDontVirtualize | RegKeyRecurseFlag; 
    HKEY hKey = NULL;
    LSTATUS status;
    if (ERROR_SUCCESS == (status = ::RegOpenKeyEx(ROOT_KEY, keyPath, 0, KEY_ALL_ACCESS, &hKey)))
    {
        NTSTATUS status = ntsik( hKey, KeyControlFlagsInformation, &kcfi, sizeof( KEY_CONTROL_FLAGS_INFORMATION ) ); 
        RegCloseKey( hKey ); 
        return TRUE;
    }

    return FALSE;
}

这篇关于如何在 C# 中设置 REG_KEY_DONT_VIRTUALIZE 标志的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆