让Win服务已当前登录用户的身份来执行函数
来源:互联网 发布:c语言自学视频 编辑:程序博客网 时间:2024/05/18 14:22
我们新建了一个网络映射,现在需要在我们的服务进程中访问这个远程磁盘,结果发现QueryDosDevice、NetUseEnum、GetLogicalDriveStrings均不可用。怎么办?
因为磁盘映射是和当前账户关联的,当账户登录之后才会存在这个盘符。(可以试试在同一个系统上建立两个账户,它们可以将不同的网络位置映射成同一个盘符。当然盘符只是一个逻辑符号,系统正真的符号是\Device\Mup和\Device\LanmanRedirector 的UNC形式标识,这样系统内部是不会重复的)。
我们的磁盘映射是Administrator账户创建的,而服务进程是SYSTEM账户。试了好多种方法都没有解决如何高效的在SYSTEM账户下的访问远程磁盘。
于是想能不能在SYSTEM账户下模拟Administrator的账户访问呢,问了公司的大神后觉得可行。就上网查找相关的资料。顺便这里记录一下以备以后查看。
方法如下:
1.得到当前登录用户的Token。
WTSGetActiveConsoleSessionId()
WTSQueryUserToken()
2.模拟当前登录用户
ImpersonateLoggedOnUser()
3.接下来可以使用本地磁盘的函数进行操作了
。。。。。。。。。
4.操作完成之后别忘了RevertToSelf。再换回SYSTEM。
程序中的代码:
头文件
#include <Wtsapi32.h>#pragma comment(lib, "Wtsapi32.lib")
1.如果当前账户是SYSTEM,需要切换到当前激活账户的环境来执行
HANDLE hTokenUser = NULL;DWORD ConsoleSessionId = 0;BOOL bImpersonateLoggedOnUser = FALSE;char userName[256] = {0};DWORD userNameLen = sizeof(userName);GetUserName(userName, &userNameLen);if (0 == stricmp("SYSTEM", userName)){// 得到当前激活用户的会话IDConsoleSessionId = WTSGetActiveConsoleSessionId();// 得到当前登录用户的令牌if (WTSQueryUserToken(ConsoleSessionId, &hTokenUser)){// 模仿成当前登录用户bImpersonateLoggedOnUser = ImpersonateLoggedOnUser(hTokenUser);}}
2.用完后
// 终止模拟,返回if (bImpersonateLoggedOnUser){RevertToSelf();}
注意事项:
1.该功能可能不支持Win2003以下版本的系统,我还没测试。
2.这里说的当前登录用户指的是哪个用户?看MSDN上的这一段话:
The session identifier of the session that is attached to the physical console. If there is no session attached to the physical console, (for example, if the physical console session is in the process of being attached or detached), this function returns 0xFFFFFFFF.
参考资料:
http://www.programlife.net/impersonateloggedonuser.html
http://hi.baidu.com/robinwjbgui/blog/item/7ab0a213b2b2bf866438db10.html
http://msdn.microsoft.com/en-us/library/windows/desktop/aa378612(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/aa383835(v=vs.85).aspx
===============================
2014-11-26更新:
接受老大的建议:上述代码中有一处不严谨。判断是否有SYSTEM权限比判用户名更好。
判断代码如下:
BOOL CurrentUserIsLocalSystem(){BOOL bIsLocalSystem = FALSE;PSID psidLocalSystem;SID_IDENTIFIER_AUTHORITY ntAuthority = SECURITY_NT_AUTHORITY;BOOL fSuccess = ::AllocateAndInitializeSid(&ntAuthority, 1, SECURITY_LOCAL_SYSTEM_RID,0, 0, 0, 0, 0, 0, 0, &psidLocalSystem);if (fSuccess) {fSuccess = ::CheckTokenMembership(0, psidLocalSystem, &bIsLocalSystem);::FreeSid(psidLocalSystem);}return bIsLocalSystem;}
参考资料:
http://support.microsoft.com/kb/118626/zh-cn
- 让Win服务已当前登录用户的身份来执行函数
- Win Vista服务中指定已登录用户会话来启动应用程序
- (转载)服务应用程序如何访问当前登录用户的信息
- 服务应用程序如何访问当前登录用户的信息
- 服务应用程序如何访问当前登录用户的信息
- 服务中创建当前登录用户名下的进程
- 服务应用程序如何访问当前登录用户的信息
- 服务应用程序如何访问当前登录用户的信息
- 在服务中以当前用户身份启动一个程序
- 已以用户 NT AUTHORITY\SYSTEM 的身份执行。 Error formatting query, probably invalid parameters [SQLSTATE 42000]
- 保存当前登录的用户
- ASP.NET中如何获得当前已登录用户的Email信息呢?
- win 7 删除了用户文件夹后出现的"你已使用临时配置文件登录"提示的解决方法
- 服务端如何识别已登录用户身份之Session管理和Cookie应用
- Oracle删除当前已连接的用户
- 无法删除当前已连接的用户
- 首次以管理员用户身份登录我的公司门户
- 服务程序中如何以当前登陆用户身份运行程序
- UML中聚合和组合的区别
- Java学习 数据存储(内存分配)
- Linux/Android——input_handler之evdev (四)
- pro-- 通讯录3-Edit
- spring 在普通类中调用注入的对象
- 让Win服务已当前登录用户的身份来执行函数
- LINUX命令总结
- UVA - 11462 - Age Sort (高效算法!!)
- 九度OJ 区间问题
- 查询转换——使用物化视图进行查询重写(4)!
- 安装minicom之后配置界面很乱,解决方法
- Weblogic 10.3.5在64位Windows系统下的安装和配置
- 实验三
- 根据网上OLEDB读写excel文件改写