C#访问另一个用户的注册表

本文关键字:注册表 用户 另一个 访问 | 更新日期: 2023-09-27 18:22:25

我目前使用的windows服务有问题。基本上,我将一些值存储在HKCU注册表中(来自作为管理员运行的GUI工具),并从该GUI中启动服务。该服务使用SYSTEM帐户运行,我认为这是我的问题——我无法访问服务中GUI工具存储的注册表项,因为它指向不同的HKCU!

如何"重定向"服务以使用与其一起存储的用户的HKCU?(事实上,如果有人告诉我如何在GUI中检索,我可以将用户名传递给服务或SID,但我不知道应该用什么来"更改"用户以指向正确的用户)

@编辑

我使用一个静态类来访问注册表,GUI和Service都使用它,检索基关键字的函数是(rootKey是包含子关键字名称的字符串变量):

private static RegistryKey GetBaseKey(bool writable = false)
        {
            try
            {
                RegistryKey reg = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
                RegistryKey rk = reg?.OpenSubKey("SOFTWARE", writable)?.OpenSubKey(rootKey, writable);
                return rk;
            }
            catch (Exception ex)
            {
                // handle exceptions later
            }
            return null;
        }

我找到了可以为当前用户提供句柄(AccessToken)的WindowsIdentity类,我是否应该将其作为参数传递给我的服务,并使用此句柄在服务内部模拟?

@EDIT2

我做了一些事情,但不起作用。我尝试过的:

CurrentUserToken = WindowsIdentity.GetCurrent().Token; // to get current identity token

然后用CCD_ 1加上CCD_作为论据。在我的服务中,我用传递的值初始化了RegistryUserToken (IntPtr),我被困在:

WindowsIdentity RegUser = new WindowsIdentity(RegistryUserToken)

抛出异常

用于模拟的令牌无效-不能重复

我对WindowsIdentity当前实例的AccessToken尝试了同样的操作-引发了相同的异常

我能走那条路吗?还是我应该尝试一些不同的东西??

C#访问另一个用户的注册表

我可以给您两个选项:如果您有该用户的凭据,则模拟该用户,或者使用HKCU是HKEY_USERS下某个键的符号链接的想法。对于模拟,您可以看到此链接。如果你知道该用户的SID,那么你可以在那里找到它。你可以这样得到SID:

var account = new NTAccount("usernameThatYouNeed");
var identifier = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier));
var sid = identifier.Value;

我更喜欢模仿。第二个选项是针对您不知道该用户凭据的情况。我不喜欢第二种选择,因为它需要在别人的账户中写入管理权限。

我需要从服务中读取另一个用户的注册表。这就是我让它工作的方式,但在这种情况下,我知道确切的用户名。这里的其他答案帮助很大。用户名和路径是你所需要的。

        NTAccount f = new NTAccount("yourUserName");
        SecurityIdentifier s = (SecurityIdentifier)f.Translate(typeof(SecurityIdentifier));
        String sidString = s.ToString();
        Microsoft.Win32.RegistryKey OurKey = Microsoft.Win32.Registry.Users;
        OurKey = OurKey.OpenSubKey(sidString + "''SOFTWARE''Classes''Local Settings''Software''Microsoft''Windows''CurrentVersion''AppContainer''Mappings", true);
        if (OurKey != null) { 
            foreach (string Keyname in OurKey.GetSubKeyNames())
            {

好吧,我已经设法以不同的方式解决了它。我已经将SID变量添加到我的Registry类中,如果它不为空,那么我打开Users-Registry Hive而不是HKCU。首先,我检索当前的用户SID(在我的GUI应用程序中)使用:

WindowsIdentity.GetCurrent().User.ToString();

我将其作为参数传递给我的服务,并将其设置为Registry类。