小编Jef*_*ler的帖子

如何在非交互式登录下通过模拟获得提升权限(UAC)?

我有一个类库,可以在注册表(HKLM\Software\XXX)中保存系统范围的配置数据.该库用于各种版本的Windows(XP,2003,7,2008 R2)上的各种应用程序(服务,Windows窗体,Web应用程序,控制台应用程序).因此,应用程序的身份不一致,甚至可能不是计算机管理员组的成员.因此,我创建了一个AD域管理员用户并进行模拟,以获得对注册表的写入权限.这在XP/2003中完美运行,但在启用UAC的系统(7/2008R2)中不起作用.我的理解是,只有交互式登录才会拆分令牌,这意味着非交互式登录(服务标识,应用程序池标识等)不会.我找不到任何可以确认的东西,但是根据这个假设,我正在做的模仿应该有效.

我编写了一个包装类来使用本机LogonUser(网络登录类型,默认提供程序)和DuplicateTokenEx(模拟,主令牌)然后使用WindowsIdentity.Impersonate()进行模拟.我得到了我的根密钥的引用:

using (ECR.Impersonator imp = new ECR.Impersonator("XXX", "XXX", "XXX"))
{
    _root = Registry.LocalMachine.CreateSubKey("SOFTWARE\\XXX", RegistryKeyPermissionCheck.ReadWriteSubTree);
}
Run Code Online (Sandbox Code Playgroud)

根据MSDN,通过使用ReadWriteSubTree,这应该是安全检查的唯一时间.我可以为该键写入值,创建子键(也使用ReadWriteSubTree)并将值写入这些子键,而无需进行其他安全检查.所以我认为我只需要进行一次昂贵的模拟 - 获取对我的根密钥的引用.

我可以将值写入我的根密钥:

_root.SetValue("cachedDate", value.ToBinary(), RegistryValueKind.QWord); }
Run Code Online (Sandbox Code Playgroud)

但是当我使用ReadWriteSubTree创建/打开一个子键时:

RegistryKey key = _root.CreateSubKey("XXX", RegistryKeyPermissionCheck.ReadWriteSubTree);
Run Code Online (Sandbox Code Playgroud)

它爆炸了Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\XXX\XXX' is denied.

虽然我很好奇为什么在MSDN说不应该进行安全检查时,我的问题是如何通过假冒来获得可能无法在交互式登录下运行的应用程序的提升权限?

c# windows impersonation uac

10
推荐指数
1
解决办法
9184
查看次数

标签 统计

c# ×1

impersonation ×1

uac ×1

windows ×1