快帮帮我!!如何实现在win98 and win2000下的远程关机?? 如何用vc实现在win98 and win2000下的远程关机和重启(可以在远程机上加载一定的程序,最好给出源代码) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 必须在远程机上加载一定的程序。1。对于98,简单! ExitWindowsEx(具体参数); 就ok了。当然你要建立一个侦听的SOCKET,收到信息进行判断,决定是否关机,不要告诉我你不懂网络编程。2。对于2000,首先要获得关机的权限,不然你只能做到注销。代码如下: static HANDLE hToken; static TOKEN_PRIVILEGES tp; static LUID luid; OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ; LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid ); tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ); 然后就和98一样了。BTW,哥们,你给的分少了点吧! 我的意思是想用SE_RAMOTE_SHUTDOWN_NAME不需要SOCKET即可以实现的!!再帮帮我吧多谢!! InitiateSystemShutdown不支持95,98,ME 那,2000 or NT该怎么做?? BOOL WINAPI PL_ExitWindow(UINT uFlag){ HANDLE hToken = NULL; TOKEN_PRIVILEGES tkp; BOOL fResult = FALSE; if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { if(LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)) { tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0)) { return ::ExitWindowsEx(uFlag, 0); } } } return ::ExitWindowsEx(uFlag, 0);}void CShutDownDlg::OnOK() { OSVERSIONINFO ver; ZeroMemory(&ver, sizeof(OSVERSIONINFO)); ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&ver); int nID = GetCheckedRadioButton(IDC_RADIO_LOGOFF, IDC_RADIO_SHUTDOWN); BOOL bForce = ((CButton*)GetDlgItem(IDC_CHECK_FORCE))->GetCheck(); int nSel = nID - IDC_RADIO_LOGOFF; UINT uFlag = bForce ? EWX_FORCE : 0; switch(nSel) { case 0: uFlag |= EWX_LOGOFF; break ; case 1: uFlag |= EWX_REBOOT; break ; case 2: { if(ver.dwMajorVersion <= 4) { uFlag |= EWX_SHUTDOWN; } else { uFlag |= (EWX_SHUTDOWN | EWX_POWEROFF); } } break ; } CDialog::OnOK(); PL_ExitWindow(uFlag);} 可以使用不InitiateSystemShutdown在NT和2000下关机,98和me没机器试。 MFC调用ActiveX控件,对象创建失败! 无法定位序数798于动态链接库mfco42d.dll 我写的任务管理器屏蔽我的程序显示的代码 请教C/S +MYSQL的一个管理系统的设计问题 100分相送 请问怎么将 CString的字符串复制到剪贴板中? 如何控制光标在控件中移动的次数? 如何获得标题栏的长度和宽度以及窗口句柄? const unsigned short *pStr该怎么赋值? 关于VC运行错误的问题 用winsock如何设置连接超时? 怎么在程序中实现系统时间不能随意更改呢?100分! 简单问题?textout如何将输出的是转90度,谢谢
1。对于98,简单! ExitWindowsEx(具体参数); 就ok了。
当然你要建立一个侦听的SOCKET,收到信息进行判断,决定是否关机,不要告诉我
你不懂网络编程。
2。对于2000,首先要获得关机的权限,不然你只能做到注销。
代码如下:
static HANDLE hToken;
static TOKEN_PRIVILEGES tp;
static LUID luid;
OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ;
LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid );
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL );
然后就和98一样了。BTW,哥们,你给的分少了点吧!
BOOL WINAPI PL_ExitWindow(UINT uFlag)
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tkp;
BOOL fResult = FALSE;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
if(LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid))
{
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0))
{
return ::ExitWindowsEx(uFlag, 0);
}
}
}
return ::ExitWindowsEx(uFlag, 0);
}void CShutDownDlg::OnOK()
{
OSVERSIONINFO ver;
ZeroMemory(&ver, sizeof(OSVERSIONINFO));
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&ver);
int nID = GetCheckedRadioButton(IDC_RADIO_LOGOFF, IDC_RADIO_SHUTDOWN);
BOOL bForce = ((CButton*)GetDlgItem(IDC_CHECK_FORCE))->GetCheck();
int nSel = nID - IDC_RADIO_LOGOFF;
UINT uFlag = bForce ? EWX_FORCE : 0;
switch(nSel)
{
case 0:
uFlag |= EWX_LOGOFF;
break ;
case 1:
uFlag |= EWX_REBOOT;
break ;
case 2:
{
if(ver.dwMajorVersion <= 4)
{
uFlag |= EWX_SHUTDOWN;
}
else
{
uFlag |= (EWX_SHUTDOWN | EWX_POWEROFF);
}
}
break ;
}
CDialog::OnOK();
PL_ExitWindow(uFlag);
}