系列文章目录
终端服务命名空间中内核对象的测试程序
TerminalService程序需要用登录不同的windows账号同时运行。才能看出效果
建议测试流程
1,先登录windows账号A,运行两个本程序实例
2,保持上述两个实例人在运行中,在登陆windows账号B,在运行两个实例
TerminalService.cpp
/*
*/
#include <stdio.h>
#include <Windows.h>
int main()
{
//先显示进程ID号和所在的会话ID
DWORD processID = GetCurrentProcessId();
DWORD sessionID;
if (ProcessIdToSessionId(processID,&sessionID))
{
wprintf(TEXT("Process '%u' runs in Terminal Services session '%u'\n"),processID,sessionID);
//测试,尝试在全局命名空间中创建内核对象,实验在不同账号下同时进行改程序时,
//第2个启动的程序会提示内核对象已存在的错误
HANDLE hGlobalMutex = CreateMutex(NULL, FALSE, TEXT("Global\\MyMutex"));
if (hGlobalMutex == NULL||ERROR_ALREADY_EXISTS == GetLastError())
{
printf("错误提示:全局命名空间已经存在命名为“MyMutex”的内核对象!\n");
}
else
{
printf("在全局命名空间中成功创建名称为“MyMutex”内核对象!\n");
}
//在全局命名空间中创建内核对象,在不同账户下同时运行该程序, 可以创建同名的内核对象
HANDLE hLocalMutex = CreateMutex(NULL, FALSE, TEXT("Local\\MyMutex"));
if (hLocalMutex == NULL || ERROR_ALREADY_EXISTS == GetLastError())
{
printf("错误提示:会话(SessionID=%u)命名空间中已经存在名称为“MyMutex”同名内核对象!\n",sessionID);
}
else
{
printf("在会话(SessionID=%u)的命名空间中成功创建名称为“MyMutex”的内核对象!\n");
}
system("pause");
CloseHandle(hGlobalMutex);
CloseHandle(hLocalMutex);
}
else
{
wprintf(TEXT("Unable to get Terminal Service session ID for process:'%u'\n"), processID);
}
system("pause");
return 0;
}