【问题标题】:Unlock Windows programmatically以编程方式解锁 Windows
【发布时间】:2011-10-21 22:59:18
【问题描述】:

在我当前的 C# 代码中,我能够以编程方式锁定 Windows 用户会话(与 Windows + L 相同)。

由于应用程序仍在运行,是否有任何方法可以从该 C# 程序中解锁会话。用户凭据是已知的。该应用在 Windows 7 上运行。

【问题讨论】:

  • 如果您有凭据(用户名和密码),您还有另一个问题。
  • 我的建议是不要锁定工作站。我的意思是,如果您想解锁,请不要锁定它。
  • 出于好奇,您能解释一下为什么要自动解锁会话吗?用例是什么?

标签: c# windows login


【解决方案1】:

这里有一些hackery来做到这一点:http://www.codeproject.com/Articles/16197/Remotely-Unlock-a-Windows-Workstation 不过自己没有测试。

不适用于 .NET 部分,但您也可以制作自己的自定义登录 UI 并在其中注入一些机制。但它很容易成为安全问题。

【讨论】:

    【解决方案2】:

    您需要一个自定义 Windows 凭据提供程序来为您登录。此外,您需要将用户的凭据保存在某处才能登录。Windows SDK 7 中有一些示例https://www.microsoft.com/en-us/download/details.aspx?id=8279

    Samples\security\credentialproviders 下有很多项目可以帮助您入门。

    解锁屏幕:

    • CSampleCredential::Initialize中设置用户名/密码
    • CSampleCredential::SetSelected 中将自动登录设置为真
    • 在硬件提供商示例中搜索WM_TOGGLE_CONNECTED_STATUS 消息以查看如何触发登录
    • 构建某种方式与您的应用通信以触发解锁(例如本地 tcp 服务器)

    这很麻烦,但它确实有效。

    【讨论】:

    • 我想让这个解决方案在 Windows 10 上运行,但我的 Windows 技能生疏了。如果您有兴趣在这里做一些咨询工作,请通过我的个人资料页面上的网站与我联系。
    【解决方案3】:
        var path = new ManagementPath();
        path.NamespacePath = "\\ROOT\\CIMV2\\Security\\MicrosoftVolumeEncryption"; path.ClassName = "Win32_EncryptableVolume";
    
        var scope = new ManagementScope(path, new ConnectionOptions() { Impersonation = ImpersonationLevel.Impersonate });
    
        var management = new ManagementClass(scope, path, new ObjectGetOptions());
    
        foreach (ManagementObject vol in management.GetInstances())
        {
    
            Console.WriteLine("----" + vol["DriveLetter"]);
            switch ((uint)vol["ProtectionStatus"])
            {
                case 0:
                    Console.WriteLine("not protected by bitlocker");
                    break;
                case 1:
                    Console.WriteLine("unlocked");
                    break;
                case 2:
                    Console.WriteLine("locked");
                    break;
            }
    
            if ((uint)vol["ProtectionStatus"] == 2)
            {
                Console.WriteLine("unlock this driver ...");
    
                vol.InvokeMethod("UnlockWithPassphrase", new object[] { "here your pwd" });
    
                Console.WriteLine("unlock done.");
            }
        }
    

    注意:这仅在您以管理员身份运行 Visual Studio 时有效。

    【讨论】:

    • 即使我使用 System.Management,在运行时在 foreach 行上获取无效的命名空间。
    • 问题是关于解锁 Windows 而不是解锁 bitlocker 锁定的驱动器
    【解决方案4】:

    当然不能解锁。解锁会话需要用户在现场输入他们的帐户凭据。允许软件执行此操作,即使使用已保存的凭据,对于使用工作站锁定的许多其他情况来说也是一个安全问题。

    【讨论】:

    • 这也是为什么你需要使用 ctrl+alt+del
    • -1 被授予,这是一个安全问题,但正如 logmein 所证明的那样,可能
    • 这不是真的。您可以使用自定义凭据提供程序。
    【解决方案5】:

    不,设计上没有办法做到这一点。您的情况是什么?为什么需要锁定/解锁工作站?

    【讨论】:

    • 它可以在 Vista 和 windows 7 上完成。查看logmein和人脸识别登录;虽然我不知道该怎么做
    • @Will03uk:这些是通过编写自定义 GINA DLL(控制登录身份验证过程)来完成的。
    • 我刚刚查了一下,自 Vista 以来,GINA DLL 已被凭据提供程序取代,这提供了更大的灵活性,并且一次提供多个提供程序
    • 这不是真的。您可以使用自定义凭据提供程序。
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 2015-06-09
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多