我当前使用的 Windows 服务有问题。基本上,我将一些值存储在HKCU
注册表(来自以管理员身份运行的 GUI 工具),并从该 GUI 中启动一项服务。该服务使用SYSTEM
帐户来运行,我相信这是我的问题 - 我无法访问服务中使用 GUI 工具存储的注册表项,因为它指向不同的HKCU
!
我怎么能够“重定向”使用的服务HKCU
存储它的用户的? (实际上我可以将用户名传递给服务或SID
如果有人告诉我如何在 GUI 中检索它,但我不知道应该使用什么"change"用户指出正确的)
EDIT 1:
我使用静态类来访问注册表,GUI 和服务都使用它,检索基本密钥的函数是(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;
}
我已经发现WindowsIdentity
可以提供句柄的类(AccessToken
)对于当前用户,我是否应该将其作为参数传递给我的服务并使用此句柄来模拟服务内部?
EDIT 2:
我做了一些事情,但没有用。我尝试过的:
CurrentUserToken = WindowsIdentity.GetCurrent().Token; // to get current identity token
然后与ServiceController.Start
我添加了CurrentUserToken.ToString()
作为一个论点。在我的服务中我初始化了RegistryUserToken (IntPtr)
使用传递的值,我陷入困境:
WindowsIdentity RegUser = new WindowsIdentity(RegistryUserToken)
抛出异常:
模拟令牌无效 - 无法复制
我尝试了同样的方法AccessToken
当前实例的WindowsIdentity
- 抛出相同的异常。
我可以走那条路吗?或者我应该尝试一些不同的东西?