可以通过Socket 先发给远程机一个信号,如 BYTE signal = 0xff; 远程机接到后,辨认出为关机命令则执行关机操作: // get system version: osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osver); VersionInfo = osver.dwPlatformId; if ( osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) bIsNt = FALSE; else if( osver.dwPlatformId == VER_PLATFORM_WIN32_NT ) bIsNt = TRUE; if (bIsNt ) { HANDLE hToken; TOKEN_PRIVILEGES tkp;
// Get a token for this process. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) AfxMessageBox("OpenProcessToken");
服务器端,具有收到某消息就关机的功能,即可!!!!!!!!!!
Good Luck
http://vip.6to23.com/NowCan1/tech/netshutd.htm
TOKEN_PRIVILEGES tkp,tkpNew;
LUID int64LpUid;OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)
LookupPrivilegeValue(NULL,"SeShutdownPrivilege",&int64LpUid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Liud=int64LpUid;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),&tkpNew,&dwSize);然后应该可以用ExitWindowsEx关机了
远程机接到后,辨认出为关机命令则执行关机操作: // get system version: osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osver);
VersionInfo = osver.dwPlatformId;
if ( osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
bIsNt = FALSE;
else if( osver.dwPlatformId == VER_PLATFORM_WIN32_NT )
bIsNt = TRUE; if (bIsNt )
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
AfxMessageBox("OpenProcessToken");
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
AfxMessageBox("AdjustTokenPrivileges");
}
//now we can reboot;
ExitWindowsEx(EWX_LOGOFF|EWX_REBOOT,0);
ExitWindowsEx(EWX_POWEROFF,0);