【问题标题】:Invoking the Windows Security Dialog (in C# or VB.NET)调用 Windows 安全对话框(在 C# 或 VB.NET 中)
【发布时间】:2010-02-16 14:38:34
【问题描述】:

我想知道如何以编程方式调用 Windows 安全对话框(在 Windows 工作站上按 ctrl+alt+del注意:我不需要任务管理器!)。

在 XP 工作站上,不用担心 Win7 或 Vista

最好有一个 C#(或 VB.NET,如果你必须)的快速示例

我搜索了许多 DLL,例如 msgina.dll,但我在任何地方都找不到!

或者只是调用更改密码屏幕会很好!

【问题讨论】:

  • 您无法再合理地调用 msgina.dll。 GINA 在 Windows Vista 中被删除并被新的安全模型取代,因此您找到的任何答案都将取决于您要支持的平台。
  • 你可能会崩溃用户的计算机,希望他点击 ctrl+alt+del

标签: c# vb.net winapi


【解决方案1】:

您可以尝试从 GINA 调用 WlxLoggedOnSAS 函数或从 WinLogon 调用 WlxSasNotify。 但是,我怕它行不通。但是,也许它会引导你找到工作方法。而且它肯定不会在 Vista/W7 中工作。

另一方面,由于安全原因,安全注意序列(ctrl+alt+del)可能调用Windows安全对话框。

【讨论】:

    【解决方案2】:

    安全功能可能会阻碍您通过 CtrlAltDel 以编程方式管理安全相关功能(例如安全对话框)。我也遇到过同样的问题。

    关于您调用密码更改对话框的请求。

    IADsUser

    旨在代表和管理网络 [和本地] 上的最终用户帐户。

    如果您发现自己缺乏解决方案,您可以使用密码字段创建自己的快速 Windows 表单,并使用 WinNT 提供程序与 Windows IADsUser Interface 进行通信以绑定到本地(而不是网络)XP机器上的用户帐户。

    GetObject("WinNT://MYCOMPUTER/jeffsmith,user") //WinNT provider
    

    ...并使用 ChangePassword(..) method(代码示例的链接)。

    usr.ChangePassword szOldPass, szNewPass
    

    如果您尝试直接调用 Windows 功能以使用户信任该过程,那么不可否认,用于更改密码的自定义表单可能看起来有点傻。

    运行DLL32

    您可能会尝试的另一种方法是在命令行以编程方式调用 RunDLL32.exe 并定位正确的 Win DLL 以调出密码更改对话框。一个论坛说,如果没有安装 SP2,则以下内容在 XP 中有效。我无法测试它,因为我在 Vista 上。

    rundll32.exe shell32.dll,Control_RunDLL password.cpl
    

    您可以Google for many of these,但它似乎在更改密码或调用 Windows 安全对话框方面做得很短。

    Microsoft's info about Run32Dll

    【讨论】:

      【解决方案3】:

      【讨论】:

      • ctrl+alt+del 无法从软件中模拟。它导致被操作系统内核捕获的硬件中断
      • 我猜你只能发消息不能得到。
      • @drorhan,没有。它称为安全注意序列,出于安全原因必须由用户在物理键盘后面生成
      • 我敢打赌,驱动程序可以将这些击键插入到硬件输入流中。
      【解决方案4】:

      我会想象这样的事情,使用'GetDesktopWindow'获取桌面的句柄,确保焦点设置在句柄上,然后使用'SendInput发送击键'Ctrl+Alt+Del' ' 或使用 'SendMessage' 将击键发送到由GetDesktopWindow 返回的句柄。它不能保证能正常工作,因为那是我最想不到的。

      希望这会有所帮助, 最好的祝福, 汤姆。

      【讨论】:

        【解决方案5】:

        这是我在其他论坛上找到的解决方法。它对我有用。

        Private Function IsRunAsAdministrator() As Boolean
        
            Dim wi = WindowsIdentity.GetCurrent()
            Dim wp = New WindowsPrincipal(wi)
        
            Return wp.IsInRole(WindowsBuiltInRole.Administrator)
        
        End Function
        

        '我在表单加载时使用它,您可以随时使用它

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        
            If Not IsRunAsAdministrator() Then
                Dim processInfo = New ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase)
                processInfo.UseShellExecute = True
                processInfo.Verb = "runas"
                Try
        
                    Process.Start(processInfo)
        
                Catch ew1 As Exception
                    MessageBox.Show("Sorry, this application must be run as Administrator.")
                End Try
                'Application.Current.Shutdown()
                Application.ExitThread()
            Else
           'your statement here
          End If
        End Sub
        

        【讨论】:

          猜你喜欢
          • 2020-08-15
          • 2014-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-13
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          相关资源
          最近更新 更多