在我的DLL中调用了Win32 API,它将由SYSTEM用户加载,并且该API根据当前用户返回不同的结果,因此我无法获得与当前用户相对应的结果,如何调用该API下的API DLL在SYSTEM上下文中运行时的当前登录用户上下文?
答案 0 :(得分:4)
我做了一些研究并得出结论(我不是Win32 API专家,但我真的很感兴趣):
您可以使用ImpersonateLoggedOnUser
,要求提供primary或impersonation令牌句柄(两者中TOKEN_QUERY
至少为TOKEN_DUPLICATE
令牌,或模拟令牌上的TOKEN_IMPERSONATE
。
如果您拥有当前登录的用户令牌和正确的权限,您只需使用ImpersonateLoggedOnUser
,调用所需的API函数,然后调用{{3} }返回其原始所有者令牌。
但是获取当前登录的用户令牌并不容易。您必须使用RevertToSelf
指定用户的名称和密码(这似乎不正确),或者拥有一个具有足够权限的Windows服务,以便您拨打LogonUser
,这可能与你正在开发的项目类型。
或者,如果您真的愿意使用普通流程执行此操作,您还可以浏览WTSQueryUserToken
,您可以在其中利用新的Windows UAC和安全上下文,这可能有点复杂与之合作。
还有一种方法,我不确定它是否有效:Authentication Functions(使用explorer.exe
上的Impersonate standard user获取令牌。
我认为有用的一些链接:
OpenProcessToken
我建议:在继续之前,确保在调用您提到的API函数时确实需要冒充用户。看看是否有其他途径可以实现你想要的目标。
您还可以指定您尝试使用的API函数,这可能会将您重定向到另一个更简单的问题。