在Vista和XP中模拟Control-Alt-Delete键序列

时间:2008-09-23 17:12:08

标签: windows winapi windows-vista

我可以在Vista中使用C#/ C ++代码 Control + Alt + 删除序列进行模拟吗? 启用/禁用UAC时? 如何在XP中完成?

您能提供适用于Vista的代码示例吗?

5 个答案:

答案 0 :(得分:6)

模拟安全注意序列(SAS)的现有代码(大多数人称之为控制alt删除或ctrl-alt-del)在Windows Vista中不再有效。似乎Microsoft提供了一个导出名为SimulateSAS()的函数的库。它不是公开的,应该通过向saslib@microsoft.com发送邮件来请求它。

有一个similar library可用,具有以下功能:

  • 无论是否有效 用户帐户控制(UAC)
  • 支持当前,控制台和 任何终端服务器会话
  • 不需要驱动程序
  • 调用应用程序不需要 签名或有特殊待遇 清单
  • 支持多种编程 语言

请注意,此图书馆不是免费的。同时,如果您对此感兴趣,可以联系info@simulatesas.com

答案 1 :(得分:2)

请使用以下信息,“saslib@microsoft.com”已被弃用,不太可能获得任何回复。以下信息就足够了。

从Windows 7操作系统和随附的软件开发工具包(SDK)的公共可用性开始,Vista应用程序的SAS功能将仅通过Windows SDK提供。通过SASLIB软件包的电子邮件发布支持,saslib将停止使用。

有关如何下载平台SDK的信息,请访问以下链接的“Windows SDK for Windows 7和.Net Framework 3.5 SP1”的Microsoft下载中心页面: http://www.microsoft.com/downloads/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&displaylang=en

安装此SDK后,您将在redist目录中找到可再发行的sas.dll:

\ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ redist \ x86 \ sas.dll

\ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ redist \ amd64 \ sas.dll

\ Program Files \ Microsoft SDKs \ Windows \ v7.0 \ redist \ ia64 \ sas.dll

答案 2 :(得分:0)

PostMessage(HWND_BROADCAST,WM_HOTKEY,0,MAKELONG(MOD_ALT | MOD_CONTROL,VK_DELETE));

你从user32 dll获得PostMessage

编辑:CodeProject article that has code for it

编辑:有一些discussion from VNC说明为什么在Vista中不起作用以及如何设置UAC以允许它。

答案 3 :(得分:0)

我已将此网址加入书签,希望对您有所帮助。 http://softltd.wordpress.com/simulate-ctrl-alt-del-in-windows-vista-7-and-server-2008/

答案 4 :(得分:0)

您必须仅从服务流程调用下一个代码

HDESK desktop = OpenDesktopW(L"Winlogon", 0, TRUE,
    DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | 
    DESKTOP_HOOKCONTROL | DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS |
    DESKTOP_SWITCHDESKTOP | GENERIC_WRITE);
int result = SetThreadDesktop(desktop);
if (result)
{
    HMODULE sasdll = LoadLibraryA("sas.dll");
    if (sasdll)
    {
        typedef void(__stdcall * SendSAS_t)(BOOL);
        SendSAS_t sendSAS = (SendSAS_t)GetProcAddress(sasdll, "SendSAS");
        if (sendSAS)
            sendSAS(FALSE);
    }
}
CloseDesktop(desktop);