Win7模拟CtrlAltDelete失败

jamseyang 2011-05-03 11:46:16
以下代码在XP下以LocalSystem执行,可以正确模拟CtrlAltDelete,但是在Win7下不行,请问怎么解决,谢谢:}

#include "windows.h"
BOOL simulateAltControlDel();

void main()
{
simulateAltControlDel();
}

BOOL simulateAltControlDel()
{
HDESK hdeskCurrent;
HDESK hdesk;
HWINSTA hwinstaCurrent;
HWINSTA hwinsta;
//
// Save the current Window station
//
hwinstaCurrent = GetProcessWindowStation();
if (hwinstaCurrent == NULL)
return FALSE;
//
// Save the current desktop
//
hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
if (hdeskCurrent == NULL)
return FALSE;
//
// Obtain a handle to WinSta0 - service must be running
// in the LocalSystem account
//
hwinsta = OpenWindowStation("winsta0", FALSE,
WINSTA_ACCESSCLIPBOARD |
WINSTA_ACCESSGLOBALATOMS |
WINSTA_CREATEDESKTOP |
WINSTA_ENUMDESKTOPS |
WINSTA_ENUMERATE |
WINSTA_EXITWINDOWS |
WINSTA_READATTRIBUTES |
WINSTA_READSCREEN |
WINSTA_WRITEATTRIBUTES);
if (hwinsta == NULL)
return FALSE;
//
// Set the windowstation to be winsta0
//
if (!SetProcessWindowStation(hwinsta))
return FALSE;

//
// Get the default desktop on winsta0
//
hdesk = OpenDesktop("Winlogon", 0, FALSE,
DESKTOP_CREATEMENU |
DESKTOP_CREATEWINDOW |
DESKTOP_ENUMERATE |
DESKTOP_HOOKCONTROL |
DESKTOP_JOURNALPLAYBACK |
DESKTOP_JOURNALRECORD |
DESKTOP_READOBJECTS |
DESKTOP_SWITCHDESKTOP |
DESKTOP_WRITEOBJECTS);
if (hdesk == NULL)
return FALSE;

//
// Set the desktop to be "default"
//
if (!SetThreadDesktop(hdesk))
return FALSE;
PostMessage(HWND_BROADCAST,WM_HOTKEY,0,MAKELPARAM(MOD_ALT|MOD_CONTROL,VK_DELETE));


//
// Reset the Window station and desktop
//
if (!SetProcessWindowStation(hwinstaCurrent))
return FALSE;

if (!SetThreadDesktop(hdeskCurrent))
return FALSE;

//
// Close the windowstation and desktop handles
//
if (!CloseWindowStation(hwinsta))
return FALSE;
if (!CloseDesktop(hdesk))
return FALSE;
return TRUE;
}

...全文
537 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jackchenyj 2012-11-12
  • 打赏
  • 举报
回复
引用 14 楼 lqy130048 的回复:
引用 12 楼 chenyujing1234 的回复: 显示,响应ATL+CTRL+DEL的winlogon.exe运行在会话1中; 而postmessage消息的进程运行在会话0中; 窗口消息是不能在会话间传递的,怎么办呢, 知道了原因,但不知怎么解决,谁有高见? 网上的代码 Ghost远控 在Win7下切换到当前活动的session下面 试过了 有效果 C/C++ ……
请问能不能把完整的代码发过来参考一下。
lqy130048 2012-11-04
  • 打赏
  • 举报
回复
引用 12 楼 chenyujing1234 的回复:
显示,响应ATL+CTRL+DEL的winlogon.exe运行在会话1中; 而postmessage消息的进程运行在会话0中; 窗口消息是不能在会话间传递的,怎么办呢, 知道了原因,但不知怎么解决,谁有高见?
网上的代码 Ghost远控 在Win7下切换到当前活动的session下面 试过了 有效果

#include <WtsApi32.h>
#include <UserEnv.h>
#pragma comment(lib,"WtsApi32.lib")
#pragma comment(lib,"UserEnv.lib")

DWORD _stdcall LaunchAppIntoDifferentSession( LPTSTR lpCommand )
{
	DWORD dwRet = 0;
	PROCESS_INFORMATION pi;
	STARTUPINFO si;
	DWORD dwSessionId;
	HANDLE hUserToken = NULL;
	HANDLE hUserTokenDup = NULL;
	HANDLE hPToken = NULL;
	HANDLE hProcess = NULL;
	DWORD dwCreationFlags;

	HMODULE hInstKernel32    = NULL;
	typedef DWORD (WINAPI *WTSGetActiveConsoleSessionIdPROC)();	
	WTSGetActiveConsoleSessionIdPROC WTSGetActiveConsoleSessionId = NULL;

	hInstKernel32 = LoadLibrary("Kernel32.dll");

	if (!hInstKernel32)		
	{	
		return FALSE;	
	}


	WTSGetActiveConsoleSessionId = (WTSGetActiveConsoleSessionIdPROC)GetProcAddress(hInstKernel32,"WTSGetActiveConsoleSessionId");


	// Log the client on to the local computer.
	dwSessionId = WTSGetActiveConsoleSessionId();

	do
	{
		WTSQueryUserToken( dwSessionId,&hUserToken );
		dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
		ZeroMemory( &si, sizeof( STARTUPINFO ) );
		si.cb= sizeof( STARTUPINFO );
		si.lpDesktop = "winsta0\\default";
		ZeroMemory( &pi, sizeof(pi) );
		TOKEN_PRIVILEGES tp;
		LUID luid;

		if( !::OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
			| TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID
			| TOKEN_READ | TOKEN_WRITE, &hPToken ) )
		{
			dwRet = GetLastError();
			break;
		}
		else;

		if ( !LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &luid ) )
		{
			dwRet = GetLastError();
			break;
		}
		else;
		tp.PrivilegeCount =1;
		tp.Privileges[0].Luid =luid;
		tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED;

		if( !DuplicateTokenEx( hPToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hUserTokenDup ) )
		{
			dwRet = GetLastError();
			break;
		}
		else;

		//Adjust Token privilege
		if( !SetTokenInformation( hUserTokenDup,TokenSessionId,(void*)&dwSessionId,sizeof(DWORD) ) )
		{
			dwRet = GetLastError();
			break;
		}
		else;

		if( !AdjustTokenPrivileges( hUserTokenDup, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL ) )
		{
			dwRet = GetLastError();
			break;
		}
		else;

		LPVOID pEnv =NULL;
		if( CreateEnvironmentBlock( &pEnv, hUserTokenDup, TRUE ) )
		{
			dwCreationFlags|=CREATE_UNICODE_ENVIRONMENT;
		}
		else pEnv=NULL;

		// Launch the process in the client's logon session.
		if( CreateProcessAsUser(    hUserTokenDup,    // client's access token
			NULL,        // file to execute
			lpCommand,        // command line
			NULL,            // pointer to process SECURITY_ATTRIBUTES
			NULL,            // pointer to thread SECURITY_ATTRIBUTES
			FALSE,            // handles are not inheritable
			dwCreationFlags,// creation flags
			pEnv,          // pointer to new environment block
			NULL,          // name of current directory
			&si,            // pointer to STARTUPINFO structure
			&pi            // receives information about new process
			) )
		{
		}
		else
		{
			dwRet = GetLastError();
			break;
		}
	}
	while( 0 );

	//Perform All the Close Handles task
	if( NULL != hUserToken )
	{
		CloseHandle( hUserToken );
	}
	else;

	if( NULL != hUserTokenDup)
	{
		CloseHandle( hUserTokenDup );
	}
	else;

	if( NULL != hPToken )
	{
		CloseHandle( hPToken );
	}
	else;

	return dwRet;
}  


//调用在ServiceMain里
/*
OSVERSIONINFO	OsVerInfoEx;
OsVerInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVerInfoEx); 
if ( OsVerInfoEx.dwMajorVersion < 6 )
{
	HANDLE hThread = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RealService, (LPVOID)SvcName, 0, NULL);
}
else
{
	CHAR lpCommand[256]; CHAR Start[MAX_PATH];
	GetModuleFileName(NxDll,Start,sizeof(Start));
	wsprintf(lpCommand, "rundll32.exe %s, Startup", Start);
	LaunchAppIntoDifferentSession( lpCommand );
}
*/
sder3445555 2012-11-04
  • 打赏
  • 举报
回复
我试过,在SYSTEM权限下也不能打开Winlogon桌面
Jackchenyj 2012-11-01
  • 打赏
  • 举报
回复
显示,响应ATL+CTRL+DEL的winlogon.exe运行在会话1中;
而postmessage消息的进程运行在会话0中;
窗口消息是不能在会话间传递的,怎么办呢,
知道了原因,但不知怎么解决,谁有高见?
Jackchenyj 2012-11-01
  • 打赏
  • 举报
回复
请问楼主解决此问题了吗?
能不能把解决方法公布出来,谢谢!
anbam 2011-05-03
  • 打赏
  • 举报
回复
支持一下,
windows7 安全要求貌似高
jamseyang 2011-05-03
  • 打赏
  • 举报
回复
千万别沉了,自己顶下!
xiaopoy 2011-05-03
  • 打赏
  • 举报
回复
学习Win7下的token方式。
LZ你也可以用key_event来模拟
oyljerry 2011-05-03
  • 打赏
  • 举报
回复
XP下面服务session跟第一个用户在同一个,Win7中服务有自己独立的session 0,用户session从1开始
Lactoferrin 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jamseyang 的回复:]

我写测试代码检查了下发现
WTSGetActiveConsoleSessionId返回值和ProcessIdToSessionId(GetCurrentProcessId(),&sessionid)后的sessionid值不相等,请问列林大神,我要怎么做呢?
[/Quote]
DuplicateToken,SetTokenInformation,把token的sessionid设置为WTSGetActiveConsoleSessionId,再使用CreateProcessAsUser创建进程
海盗医生 2011-05-03
  • 打赏
  • 举报
回复
使用服务方式运行
关闭WIN7 UAC

执行OpenDesktop("Winlogon"...是需要LocalSystem权限的
jamseyang 2011-05-03
  • 打赏
  • 举报
回复
我写测试代码检查了下发现
WTSGetActiveConsoleSessionId返回值和ProcessIdToSessionId(GetCurrentProcessId(),&sessionid)后的sessionid值不相等,请问列林大神,我要怎么做呢?
Lactoferrin 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jamseyang 的回复:]

引用 3 楼 lactoferrin 的回复:

引用 1 楼 jamseyang 的回复:

千万别沉了,自己顶下!

你是不是以服务的方式运行?应该在active console session执行你的程序。

服务方式、任务计划都试过了,不行!
[/Quote]
检查进程的SessionId是不是console session id
比较WTSGetActiveConsoleSessionId返回值和ProcessIdToSessionId(GetCurrentProcessId(),&sessionid)后的sessionid
jamseyang 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lactoferrin 的回复:]

引用 1 楼 jamseyang 的回复:

千万别沉了,自己顶下!

你是不是以服务的方式运行?应该在active console session执行你的程序。
[/Quote]
服务方式、任务计划都试过了,不行!
Lactoferrin 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jamseyang 的回复:]

千万别沉了,自己顶下!
[/Quote]
你是不是以服务的方式运行?应该在active console session执行你的程序。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧