Win2000下自动关机的问题??????
WIN2000下
锁定计算机后,我想实现定时自动关机,现在有两个问题:
1:WIN2000关闭系统的程序的路径?
2:如何自动解除锁定?
有没有人做个的程序参考一下。
问题点数:100、回复次数:11Top
1 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-07-18 10:19:11 得分 10
ExitWindowsTop
2 楼wxq888(我要我要我就要我还要)回复于 2002-07-18 10:47:55 得分 0
我试过了,在CMainFrame::OnDestroy()中调用ExitWindows不行Top
3 楼FreeSeagull(蓝天,白云,松花江)回复于 2002-07-18 10:56:39 得分 5
ExitWindowsEx()Top
4 楼HKer_007(伙计,拿杆烟来吃)回复于 2002-07-18 11:00:20 得分 0
同意Top
5 楼liuliangbo(liu)回复于 2002-07-18 11:00:57 得分 10
在WINDOWS 2000中要有关机的权限才能够关闭计算机,单ExitWindows函数是不行的,调用调整权限的函数使应用程序具有关机的权限,然后调用关机函数就OK了。Top
6 楼52cgi(鬼行者)回复于 2002-07-18 11:01:19 得分 0
顺便问问,Win98和Win2K的关机方法好像不同,
谁知道分别如何实现的?Top
7 楼chkdsk(猪是的念来过倒)回复于 2002-07-18 11:01:43 得分 0
InitiateSystemShutdown()?Top
8 楼AaronLiu(放不稳的鸡蛋)回复于 2002-07-18 11:15:08 得分 40
我给你一段代码吧,下面是我的关机程序的部分代码
void CShutDownView::OnLogoff()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
LUID sedebugnameValue;
if(!IsWin98())
{
if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return ;
if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )
{
CloseHandle( hToken );
return ;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
CloseHandle( hToken );
}
if(!ExitWindowsEx(EWX_LOGOFF,0L))
AfxMessageBox("关闭计算机失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。
}
void CShutDownView::OnExit()
{
CWnd* pMainWindow = AfxGetMainWnd();
::PostMessage(pMainWindow->m_hWnd,WM_CLOSE,0,0);
}
void CShutDownView::OnRestart()
{
/*
步骤:
1、opens the access token associated with a process.
*/
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
LUID sedebugnameValue;
if(!IsWin98())
{
if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return ;
/* The LookupPrivilegeValue function retrieves the locally unique identifier (LUID)
used on a specified system to locally represent the specified privilege name.
BOOL LookupPrivilegeValue(
LPCTSTR lpSystemName,// address of string specifying the system
LPCTSTR lpName, // address of string specifying the privilege
PLUID lpLuid // address of locally unique identifier
);
*/
if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )
{
CloseHandle( hToken );
return ;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
/*
The AdjustTokenPrivileges function enables or disables privileges in the specified access token. Enabling or disabling privileges in an access token requires TOKEN_ADJUST_PRIVILEGES access.
TokenPrivileges(
HANDLE TokenHandle, // handle to token that contains privileges
BOOL DisableAllPrivileges,// flag for disabling all privileges
PTOKEN_PRIVILEGES NewState,// pointer to new privilege information
DWORD BufferLength, // size, in bytes, of the PreviousState buffer
PTOKEN_PRIVILEGES PreviousState, // receives original state of changed privileges
PDWORD ReturnLength // receives required size of the PreviousState buffer
);*/
AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
CloseHandle( hToken );
}
if(!ExitWindowsEx(EWX_REBOOT,0L))
AfxMessageBox("重新启动失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。
}
void CShutDownView::OnShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
LUID sedebugnameValue;
if(!IsWin98())
{
if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return ;
if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )
{
CloseHandle( hToken );
return ;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
CloseHandle( hToken );
}
if(!ExitWindowsEx(EWX_SHUTDOWN,0L))
AfxMessageBox("关闭计算机失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。
}
void CShutDownView::OnPoweroff()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
LUID sedebugnameValue;
if(!IsWin98())
{
if(!OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
return ;
if(!LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME , &sedebugnameValue ) )
{
CloseHandle( hToken );
return ;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL );
CloseHandle( hToken );
}
if(!ExitWindowsEx(EWX_POWEROFF,0L))
AfxMessageBox("关闭计算机失败!"); ////EWX_REBOOT可以用其它参数代替来实现关闭电源等功能。
}
BOOL CShutDownView::IsWin98()
{
DWORD dwVersionNum = GetVersion();
if(dwVersionNum<0x80000000)//NT
return FALSE;
else //WIN98
return TRUE;
}
Top
9 楼wxq888(我要我要我就要我还要)回复于 2002-07-18 11:17:19 得分 0
哪个函数具有调整权限的功能,使应用程序具有关机的权限?Top
10 楼cdutgch(欢喜游龙)回复于 2002-07-18 11:41:15 得分 35
这段代码应该也是可以的,先获取特权然后再.....
BOOL CMainFrame::shutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
BOOL fResult; // Get the current process token handle so we can get shutdown privilege.
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return FALSE; // Get the LUID for shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get 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)
return FALSE;
// Actually shutdown
fResult = InitiateSystemShutdown(NULL, NULL, 0, TRUE, FALSE);
// to shutdown
// fResult = InitiateSystemShutdown(NULL, NULL, 0, TRUE, TRUE);
// to reboot
if(!fResult)
return FALSE; // Disable shutdown privilege.
tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
if(GetLastError() != ERROR_SUCCESS)
return FALSE;
return TRUE;
}
Top



