Win7下VC编程设置冬眠(需要开放【SE_SHUTDOWN_NAME】权限)

本文介绍了一个C/C++函数SetPrivilege,该函数用于在Windows系统中启用或禁用进程令牌的特定特权。通过使用LookupPrivilegeValue和AdjustTokenPrivileges函数,此功能能够使应用程序获得足够的权限来执行如关闭计算机等高权限操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BOOL SetPrivilege(
				  HANDLE hToken,          // access token handle
				  LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
				  BOOL bEnablePrivilege   // to enable or disable privilege
				  ) 
{
	TOKEN_PRIVILEGES tp;
	LUID luid;
	
	if ( !LookupPrivilegeValue( 
		NULL,            // lookup privilege on local system
		lpszPrivilege,   // privilege to lookup 
		&luid ) )        // receives LUID of privilege
	{
		printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
		return FALSE; 
	}
	
	tp.PrivilegeCount = 1;
	tp.Privileges[0].Luid = luid;
	if (bEnablePrivilege)
		tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	else
		tp.Privileges[0].Attributes = 0;
	
	// Enable the privilege or disable all privileges.
	
	if ( !AdjustTokenPrivileges(
		hToken, 
		FALSE, 
		&tp, 
		sizeof(TOKEN_PRIVILEGES), 
		(PTOKEN_PRIVILEGES) NULL, 
		(PDWORD) NULL) )
	{ 
		printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
		return FALSE; 
	} 
	
	if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
		
	{
		printf("The token does not have the specified privilege. \n");
		return FALSE;
	} 
	
	return TRUE;
}

//
// 设置【SE_SHUTDOWN_NAME】权限
//
void CTestDlg::OnButton1() 
{
	if(::MessageBox(NULL, "是否确认?", "询问", MB_ICONQUESTION|MB_YESNO) == IDNO)
		return;


	HANDLE hToken;
	BOOL bRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken);
	bRet = SetPrivilege(hToken, SE_SHUTDOWN_NAME, TRUE);
	if (!bRet)
	{
		AfxMessageBox("权限设置错误");
	}


	SetSystemPowerState(
		FALSE,	//为FASLE时悬挂;为TRUE时冬眠
		FALSE	//
		);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值