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尝试了同样的操作-引发了相同的异常
我能走那条路吗?还是我应该尝试一些不同的东西??
我可以给您两个选项:如果您有该用户的凭据,则模拟该用户,或者使用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类。