前言
当你在别人的服务器上偷偷跑东西时,总是会提心吊胆,如果管理员上线了怎么办?跑的一半半突然管理员登陆上来看到一个黑框框岂不是全部木大?特此我们得来研究研究一些如何偷跑程序的方法
方法1 --- Windows 消息系统
windows下任何东西都离不开windows消息机制,就连RDP登录登出注销也一样。所以我们创建个窗口直接接受windows消息就行
直接参考代码:管理员登陆报警器
缺点:就是需要创建窗体
方法2 --- 计划任务:空闲时运行
缺点:不要(x) --- 停不下来了(√)
方法3 --- CMD query user
直接query user
也不是不可,但是很多系统语言不同导致你的判断依据失败
典型的比如中文是 运行中 而 英文是 Active
最好的办法是运行chcp 65001 && query user
,然后匹配Active就行了。
当然一定要注意忽略chcp的Active code page: 65001
缺点:如果你的程序运行在SYSTEM下你的chcp会失效。
方法4 --- WINDOWS API
方法和上面差不多,但是我TMD当场进行一个API查询
直接查阅msdn:WTSEnumerateListenersA
最后随便找了段代码
PWTS_SESSION_INFO psi;
_WTS_CONNECTSTATE_CLASS a;
DWORD dwCount;
BOOL bRet = WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &psi, &dwCount);
if (!bRet)
return 0;
wstring strName;
for (unsigned int i = 0; i < dwCount; i++)
{
printf("%s \t", psi[i].pWinStationName);
printf("%d \t", psi[i].SessionId);
printf("%d \n", psi[i].State);
}
WTSFreeMemory(psi);
然后对应结果直接去查询这个
typedef enum _WTS_CONNECTSTATE_CLASS {
WTSActive, // User logged on to WinStation
WTSConnected, // WinStation connected to client
WTSConnectQuery, // In the process of connecting to client
WTSShadow, // Shadowing another WinStation
WTSDisconnected, // WinStation logged on without client
WTSIdle, // Waiting for client to connect
WTSListen, // WinStation is listening for connection
WTSReset, // WinStation is being reset
WTSDown, // WinStation is down due to error
WTSInit, // WinStation in initialization
} WTS_CONNECTSTATE_CLASS;
最后判断下是否有WTSActive的就说明有无人在线了。