Вход в Windows 7 с помощью приложения, открытого на заблокированной рабочей станции - PullRequest
3 голосов
/ 13 марта 2011

Я написал приложение smaall на c #. Я хочу, чтобы это приложение блокировалось, чтобы разблокировать рабочую станцию ​​под своим логином.

Блокировка рабочей станции довольно проста и работает нормально.

Проблема начинается, когда я хочу разблокировать рабочую станцию.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using System.Security.Principal;
using System.Security.Permissions;
using System.Drawing;


namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    [DllImport("User32.dll")]
    public static extern IntPtr GetDC(IntPtr hwnd);

    [DllImport("User32.dll")]
    public static extern void ReleaseDC(IntPtr dc);

    IntPtr desktopDC;
    Graphics g;

    public static class Logon
    {
        [DllImport("User32.Dll", EntryPoint = "LockWorkStation"), Description("Locks the workstation's display. Locking a workstation protects it from unauthorized use.")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool LockWorkStation();

        /// <exception cref="Win32Exception">if the lock fails more information can be found in this Exception class</exception>
        public static void LockWorkstation()
        {
            if (!LockWorkStation())
                throw new Win32Exception(Marshal.GetLastWin32Error());
        }

        [DllImport("advapi32.dll", EntryPoint = "LogonUser")]
        public static extern bool LogonUser(

        string lpszUsername,

        string lpszDomain,

        string lpszPassword,

        int dwLogonType,

        int dwLogonProvider,

        ref IntPtr phToken);
    }

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Logon.LockWorkstation();
        timer1.Start();   
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Stop();
        Login();
    }

    private void Login()
    {
        string sUsername = "adam";
        string sDomain = System.Environment.MachineName;
        string sPassword = "sernik";

        const int LOGON32_PROVIDER_DEFAULT = 0;
        // create token

        const int LOGON32_LOGON_INTERACTIVE = 2;
        //const int SecurityImpersonation = 2;


        IntPtr pExistingTokenHandle = new IntPtr(0);
        IntPtr pDuplicateTokenHandle = new IntPtr(0);
        pExistingTokenHandle = IntPtr.Zero;
        pDuplicateTokenHandle = IntPtr.Zero;


        bool a = Logon.LogonUser(sUsername, sDomain, sPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle);

        g.DrawString(a.ToString(), new Font(FontFamily.GenericSansSerif, 80), Brushes.Red, 100, 100);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Login();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        desktopDC = GetDC(IntPtr.Zero);

        g = Graphics.FromHdc(desktopDC);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        g.Dispose();
        ReleaseDC(desktopDC);
    }
}
}

Я пробовал метод LogonUser, но он дает только мой истинный или ложный результат и фактически не разблокирует экран.

Как это сделать под windows 7?

Суть приложения заключается в том, чтобы обнаруживать наличие электронного ключа, подключенного к ПК, и затем блокировать или разблокировать рабочую станцию.

1 Ответ

4 голосов
/ 13 марта 2011

Смысл приложения заключается в том, чтобы обнаруживать наличие электронного ключа, подключенного к ПК, и затем блокировать или разблокировать рабочую станцию.

До Windows Vista вы могли сделать что-то подобное с GINA , поскольку вы упомянули Windows 7, вам придется использовать новую инфраструктуру .В любом случае, вы не можете добиться такого поведения, просто запустив программу на данном компьютере, вам необходимо подключиться к системам аутентификации Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...