Я написал приложение 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?
Суть приложения заключается в том, чтобы обнаруживать наличие электронного ключа, подключенного к ПК, и затем блокировать или разблокировать рабочую станцию.