Ome*_*Doe 4 windows service winapi
我正在尝试使服务在Windows中打开的会话中创建一个进程.我有这个代码:
sessionId =WTSGetActiveConsoleSessionId();
if (WTSQueryUserToken(sessionId,&dummy)) {
if (!DuplicateTokenEx(dummy, TOKEN_ALL_ACCESS, NULL, SecurityDelegation, TokenPrimary, &token)) {
CloseHandle(dummy);
return false;
}
CloseHandle(dummy);
// Create process for user with desktop
myfile = fopen("c:\\temp\\test123.txt", "a");
fprintf(myfile, "before create!!!!\n");
fclose(myfile);
if (!CreateProcessAsUser(token, NULL,NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { // The "new console" is necessary. Otherwise the process can hang our main process
CloseHandle(token);
myfile = fopen("c:\\temp\\test123.txt", "a");
fprintf(myfile, " create failed!\n");
fclose(myfile);
return false;
}
CloseHandle(token);
}
else {
myfile = fopen("c:\\temp\\test123.txt", "a");
fprintf(myfile, "Dummy fail\n");
fprintf(myfile, "last error is %d \n", GetLastError());
fclose(myfile);
}
//int ret = CreateProcess(FILE_EXEC, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
Run Code Online (Sandbox Code Playgroud)
如果我在服务的安装中使用最后一个(注释),所有工作正常,因为它在安装服务时运行,所以它发生在用户会话内但是当我希望服务执行它失败时,sessionId是好的,失败开始于:
if (WTSQueryUserToken(sessionId,&dummy)) {
Run Code Online (Sandbox Code Playgroud)
我知道WTSQueryUserToken是一个应该从服务运行的函数,sessionid是1(它是来自cmd检查的实数)并且假设在它之后保存用户令牌但由于某种原因它失败了....有任何想法吗?
Rem*_*eau 12
我在自己的服务中使用类似于你的代码,它工作正常.有些事情需要考虑到您展示的代码没有做到:
调用时WTSQueryUserToken(),您必须确保您的服务进程已SE_TCB_NAME启用该权限.使用AdjustTokenPrivileges()了点.
返回的会话ID WTSGetActiveConsoleSessionId() 可能不是您运行生成的进程所需的正确会话!它返回附加到本地计算机的物理控制台(屏幕/键盘/鼠标)的会话ID (如果有).该会话可能正在显示安全的WinLogon桌面,这意味着没有用户实际登录到物理机,因此调用WTSQueryUserToken()该会话ID将失败并显示ERROR_NO_TOKEN错误.例如,用户可以通过远程桌面连接登录,在这种情况下,该连接将在与控制台不同的会话中运行.如果希望生成的进程在用户登录的会话中运行,则需要使用WTSEnumerateSessions()该查找状态的会话WTSActive.即使这样,WTSQueryUserToken()根据用户的登录方式,也可能不会返回令牌,因此您需要WTSQueryUserToken()在找到的每个活动会话上调用,直到找到成功为您提供令牌的会话.
通话时DuplicateTokenEx(),请使用SecurityIdentification而不是SecurityDelegation.
调用时CreateProcessAsUser(),您可以CreateEnvironmentBlock()先调用以创建适合该特定用户的环境,然后将该指针传递给CreateProcessAsUser().否则,生成的进程将使用您的服务环境.此步骤是可选的,具体取决于生成的应用程序的特定需求.
| 归档时间: |
|
| 查看次数: |
5685 次 |
| 最近记录: |