将注册表写入 hkey_current_user 而不是 hkey_users

2023-12-02

我尝试将注册表子项及其相应的值写入注册表,如下所示:

Microsoft.Win32.RegistryKey mykey;
mykey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\Windows\\Muhil Software");
mykey.SetValue("Muhil", "TEST");
mykey.close();

正如你所看到的,我用了CurrentUser将值写入HKEY_CURRENT_USER,里面什么都没有HKEY_CURRENT_USER。然后我检查了子项HKEY_USERS并发现密钥写在那里。


您的安装程序不会在登录的用户会话下运行,而是在本地系统会话下运行。这就解释了为什么HKCU指向另一个注册表配置单元。

为了打开登录用户的注册表项,您需要打开此注册表项HKU/<LOGGED_ON_USER_SID>。您可以通过 Windows 会话 API 获取此 SID(安全标识符)。

您可以使用Microsoft.Win32.Registry.Users代替Microsoft.Win32.Registry.CurrentUser并根据用户 SID 打开正确的用户密钥。

例如,您可以在 stackoverflow 上找到有关如何获取当前登录的 SID 的多个主题如何在 Windows 中获取当前用户登录会话的唯一 ID - c#

更新:能够获取登录用户 SID 字符串的示例代码,它只能在系统会话中工作,因为它需要特殊权限SE_TCB_NAME。为了简单起见,没有错误处理

static void Main(string[] args)
{
    Microsoft.Win32.RegistryKey mykey;
    mykey = Microsoft.Win32.Registry.Users.CreateSubKey(GetLoggedOnUserSID() + "\\Software\\Microsoft\\Windows\\Muhil Software");
    mykey.SetValue("Muhil", "TEST");
    mykey.Close();
}

enum TokenInformationClass
{
    TokenOwner = 4,
}

struct TokenOwner
{
    public IntPtr Owner;
}

[DllImport("advapi32.dll", EntryPoint = "GetTokenInformation", SetLastError = true)]
static extern bool GetTokenInformation(
    IntPtr tokenHandle,
    TokenInformationClass tokenInformationClass,
    IntPtr tokenInformation,
    int tokenInformationLength,
    out int ReturnLength);

[DllImport("kernel32.dll")]
private static extern UInt32 WTSGetActiveConsoleSessionId();

[DllImport("wtsapi32.dll", SetLastError = true)]
static extern bool WTSQueryUserToken(UInt32 sessionId, out IntPtr Token);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool ConvertSidToStringSid(IntPtr sid, [In, Out, MarshalAs(UnmanagedType.LPTStr)] ref string pStringSid);

static string GetLoggedOnUserSID()
{
    IntPtr tokenOwnerPtr;
    int tokenSize;
    IntPtr hToken;

    // Get a token from the logged on session
    // !!! this line will only work within the SYSTEM session !!!
    WTSQueryUserToken(WTSGetActiveConsoleSessionId(), out hToken); 

    // Get the size required to host a SID
    GetTokenInformation(hToken, TokenInformationClass.TokenOwner, IntPtr.Zero, 0, out tokenSize);
    tokenOwnerPtr = Marshal.AllocHGlobal(tokenSize);

    // Get the SID structure within the TokenOwner class
    GetTokenInformation(hToken, TokenInformationClass.TokenOwner, tokenOwnerPtr, tokenSize, out tokenSize);
    TokenOwner tokenOwner = (TokenOwner)Marshal.PtrToStructure(tokenOwnerPtr, typeof(TokenOwner));

    // Convert the SID into a string
    string strSID = "";
    ConvertSidToStringSid(tokenOwner.Owner, ref strSID);
    Marshal.FreeHGlobal(tokenOwnerPtr);
    return strSID;        
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将注册表写入 hkey_current_user 而不是 hkey_users 的相关文章

随机推荐

  • C# 中的别名关键字(如 typedef)?

    我有 2 个库 在不同平台上有不同的大小写 似乎其他所有内容都是相同的 方法名称 参数顺序等 我如何创建一个别名 以便我当前的平台 a 拼写在编译时起作用对于平台 b 我真的不想为大小写差异制作一个包装器 您可以使用 using 关键字创建
  • C# 到 VB6 COM 事件(“对象或类不支持事件集”)

    真的是用这个把我的头发拉出来了 我有一个 C 项目 其接口定义为 Externally Accessible API InterfaceType ComInterfaceType InterfaceIsIDispatch public in
  • 如何在 WiX 中安装时填充组合框?

    编辑 我已经更新了下面的代码 现在它可以工作了 感谢罗布的回答 我找到了几页展示如何执行此操作 http www cmcrossroads com content view 13160 120 http www mail archive c
  • 带有国家点击和缩放功能的 d3 世界地图几乎无法正常工作

    我正在制作一张具有点击缩放功能的世界地图 当点击一个国家时 地图会放大 但该国家并不总是居中 当你点击并重复时 也会发生同样的情况 它似乎永远不会提供相同的结果 注意 如果禁用过渡功能 缩放和居中确实有效 只有在添加旋转时才会显示不正确 我
  • 隐藏用户表单后如何返回或重新显示它?

    我在 UserForm2 的一个命令按钮中包含以下代码 Private Sub CButton1 Click UserForm1 Show Me Hide End Sub Now Userform1显示 然后我在 Userform1 的一个
  • 如何打印使用 Apache Poi 和 java 制作的工作簿文件?

    我在 eclipse 中创建一页工作簿文件 需要打开打印对话框并打印这些文件 我了解如何打开打印对话框和所有内容 我只是找不到如何告诉系统它是我想要打印的工作簿文件 wb 因此 除非它知道我想用它打印什么 否则打开对话框是行不通的 有人至少
  • 未在此范围内声明的变量

    我正在为类制作一个程序 由于某种原因 当在类定义中声明它时 它给了我这个错误 错误 在函数中 void setMessageBuffer std string 错误 message 在这方面没有申明 class apple private
  • 是否可以在不使用 win32 API 库的情况下在 C# 中获取 LAN 中连接的 IP 地址列表?

    我正在尝试获取在 LAN 中连接的 IP 地址列表 是否可以在不使用 win32 API 库 Netapi32 dll 的情况下获得 有什么想法可以在不使用非托管 win32 动态库的情况下获得 Windows 7 操作系统的目标 您可以使
  • UIButton 与 UITableViewCellSelectionStyleGray 选择颜色

    我试图将 UIButton 的选定颜色设置为 UITableViewCellSelectionStyleGray 的颜色 问题是 UIButton 的选择颜色无法设置 只能设置图像 有谁知道如何使用 UITableViewCellSelec
  • 如何在 C# Windows 应用程序中的表单之间传递值?

    我有两个表单 A 和 B 表单 A 是应用程序的默认启动表单 我在 Form A 中做了一些事情 然后我想并行运行 Form B 然后通过 从表单 A 到表单 B 中的方法的参数 How Ian 给出了一些示例代码 但我想提出更广泛的观点
  • 使用 Excel 2016 将范围保存为图片

    该代码的目的是将一系列单元格保存为桌面上的图片 该文件已创建 但不包含任何单元格数据 它是具有范围相对大小的空白图像 该问题出现在 Office 2016 中 在 2013 中有效 Sub SendSnapshot2 Dim strRng
  • 将 CAGradient 遮罩层应用到 UITextView

    我有一个 UITextView 带有可滚动文本 我试图对其应用渐变层 因此可见文本的底部总是稍微淡出 这是我的代码 CAGradientLayer maskLayer CAGradientLayer layer maskLayer colo
  • 获取 EditText 中按下的键

    I want to know which key has been pressed in an EditText For example if a is pressed I want to get the value as a How ca
  • 在对象中按名称查找嵌套属性的最佳方法

    我有一个对象 dataLayer 它可以增加和减少长度 具体取决于您访问的页面数量 我想要 循环遍历目标并查找属性名称 ecommerce 我特别想找到 brandcode 的值 必须与 pagetitle Login Page 位于同一对
  • 如何使用 UIImage(contentsOfFile:String) 方法从 Images.xcassets 文件夹加载图像

    我知道之间的区别UIImage named String and UIImage contentsOfFile String 我刚刚保存了超过 200MB 的图像图片 xcassets文件夹 我发现我的应用程序内存使用量很大 超过 500
  • 无法从 java jar 运行 python 脚本

    在 IntelliJ 中工作时一切正常 但在我构建 jar 之后它就停止了 起初 只是我忘记将它放入 jar 构建配置中 但现在在确保它在那里之后 我仍然无法运行它 这些是我尝试的方法 InputStream script mainView
  • 用公式逻辑决定游戏结果

    我正在努力成为一名更好的编码员 其中包括摆脱我的 硬编码 习惯 以保持我的程序动态且易于维护 现在我正在编写一个简单的石头剪刀布游戏作为练习 import time validoptions rock paper scissors u1in
  • 我存储了刷新令牌,如何使用它来刷新我的访问令牌

    根据我的阅读 我可以看到curl 使用我的刷新令牌获取access token 我如何使用 python 重用我的刷新令牌 如果这是重复的 谢谢并抱歉 如果您使用的是 Google API Python 客户端库 则当您的访问令牌过期时 将
  • 编号点标签加上散点图中的图例

    我正在尝试在 R 中的散点图中标记点 ggplot2 使用数字 1 2 3 然后将数字与图例中的名称相匹配 1 Alpha 2 Bravo 3 Charlie 作为处理太多的方法 情节上的标签太长 我们假设这是 a df Name X At
  • 将注册表写入 hkey_current_user 而不是 hkey_users

    我尝试将注册表子项及其相应的值写入注册表 如下所示 Microsoft Win32 RegistryKey mykey mykey Microsoft Win32 Registry CurrentUser CreateSubKey Soft