服务程序中如何以当前登陆用户身份运行程序
来源:互联网 发布:深度linux怎么样 编辑:程序博客网 时间:2024/06/05 20:58
开发中有时会遇到这样的问题,当服务程序需要使用某些功能时,由于用户的关系而受到限制,比如访问注册表的HKEY_CURRENT_USER键,使用网络等等,这时候就需要以当前登陆用户的身份去进行操作,通常会创建一个进程来完成需要的功能。
如果使用CreateProcess来创建进程的话,新创建的进程和服务程序依然是相同的用户身份,还是无法达到目的,只有使用CreateProcessAsUser了。但CreateProcessAsUser的第一个参数是HANDLE hToken,该参数通常应该用LogonUser来获得,但是LogonUser又需要用户名和用户密码,这样就很不现实。那应该怎么办呢?我想到了一个方法可以绕过LogonUser直接获得hToken。因为用户已经登陆,那么肯定有Shell(就是EXPLORER.EXE)运行了,我们可以通过遍历进程来取得Shell的hToken来运行进程。下面就是示例代码:
BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
{
if(!lpName)
{
return FALSE;
}
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hProcessSnap, &pe32))
{
do
{
if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE,pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
CloseHandle (hProcessSnap);
return (bRet);
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE;
CloseHandle (hProcessSnap);
return (bRet);
}
BOOL RunProcess(LPCSTR lpImage)
{
if(!lpImage)
{
return FALSE;
}
HANDLE hToken;
if(!GetTokenByName(hToken,"EXPLORER.EXE"))
{
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);
si.lpDesktop = TEXT("winsta0//default");
BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,
FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
CloseHandle(hToken);
if(bResult)
{
OutputDebugString("CreateProcessAsUser ok!/r/n");
}
else
{
OutputDebugString("CreateProcessAsUser false!/r/n");
}
return bResult;
}
这样就可以以登陆用户的身份来运行程序了.
- 服务程序中如何以当前登陆用户身份运行程序
- 服务程序中如何以当前登陆用户身份运行程序
- win7 createprocess 如何以当前登陆用户身份运行程序
- 在服务中以当前用户身份启动一个程序
- linux下如何以某个用户的身份运行程序
- localsystem以指定用户身份运行程序
- [C++]以不同用户身份运行程序
- 如何以管理员身份自动运行 程序
- C#如何以管理员身份运行程序
- C#如何以管理员身份运行程序
- C#如何以管理员身份运行程序
- C#如何以管理员身份运行程序
- 如何自动以管理员身份运行程序
- C#如何以管理员身份运行程序
- C#如何以管理员身份运行程序
- 如何在Windows服务中以当前用户启动一个程序
- 服务程序中如何得到当前登陆用户名(ZZ)
- 服务程序中如何得到当前登陆用户名
- 回首往事 之 来自经理的帮助——《轻松Scrum之旅》(10)
- MySQL中设置自增字段
- 免费论文查找
- 学车(六)
- Flex中用鼠标拖动LineChart图表的折线
- 服务程序中如何以当前登陆用户身份运行程序
- 邮件发送给业绩带来的提生影响统计
- 域名基础知识
- 面试两个人应届生的经验 -------转自《学生大本营》的杨中科老师的笔记
- 打印报表版本1.0
- Thinking in Java 附录之推荐书籍
- Bloom Filter算法
- 曾令鲍尔默怒摔椅子的Google工程主管跳槽至VMware
- C#后台获取网页内容