首页 » 原創 » 正文

[原创]JavaSe结合刷卡技术的电脑锁定

真的懒得上图了,很累。实验的时候请先理解源代码再运行!!!因为会涉及到锁定系统,禁用alt和更改管理员密码等操作。
众所周知,java是不太适合操作系统底层的,所以类似禁用任务管理器,禁用键盘的操作真的很难,我用了其它思路来间接解决这个问题。程序一运行,将全屏显示在最前端,屏蔽关闭和最小化,杀灭explorer进程,使用户无法按win键,杀灭taskmgr进程,防止用户之前启动了任务管理器并置于前端,将错误的卡置于刷卡器,屏幕报错,超过5次错误,锁定一分钟,此时将不接受所有卡,一分钟后再错再锁一分钟,以此类推,刷正确的卡将恢复离开时的桌面(就是程序退出,重开explorer),最关键的问题是如何防止用户调用ctrl+alt+del(调出任务管理器)或alt+f4(关闭程序)以及alt+Tab(切换程序),先前我的想法是加一个线程,不断地检查并关闭taskmgr,但因为太耗费资源而禁用(i7的cpu99%,16g内存10分钟95%),后来我让程序不断模拟按键esc,任务管理器调出后会迅速关闭,但这种方法无法防止后面两个快捷键,查了很多方法均以失败告终,最终,我想了一个不是办法的办法,监听窗口alt按键(因为此时窗口全屏不可能失去焦点),当用户按下alt后立刻自动锁定计算机,如果计算机此时是空密码将自动添加一个预设密码。关于间隔时间检测:我加了一个线程,定义了一个变量,每100毫秒自减,当小于-50会固定在-50(防止int溢出),当多次错误会将变量置于600,随着时间递减,然后再在验证的时候看下这个变量是否为负数,如果不是,拒绝验证
然而,这和直接win+l锁定计算机有什么不同?我想了一下主要有几点:1.退出程序密码,原本的系统密码,和尝试按alt后锁定计算机的密码相互独立,也就是说,可以多加一个系统锁2.自定义多次尝试密码错误的操作:可以关机,可以删除指定文件,甚至可以发送警告短信或邮件,同时对于两次错误密码的间隔时间也可以设置3.多人共享一个用户,密码由刷卡机控制,凡是符合条件的卡都可进入系统。顺便说下,可以将程序密码,预设系统密码放到程序外面,写个程序修改这些加密数据,但是很累,不想做了。
===然而,感觉这些并没有什么卵用(手动摊手)===
源代码
package abc;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;

public class AFrame extends JFrame implements Runnable {

	private static final long serialVersionUID = 1L;
	int n = 5;
	int t = -50;
	
	Toolkit kit = Toolkit.getDefaultToolkit();
	JFrame jf;
	Dimension screensize = kit.getScreenSize();
	int Width = screensize.width;
	int Height = screensize.height;

	public AFrame() {
		jf = new JFrame();
		jf.setBounds(0, 0, Width, Height);
		Container c = new Container();
		JLabel jb1 = new JLabel("解锁计算机请将智能卡放入感应区");
		JLabel jb2 = new JLabel("xxx制作");
		jf.setUndecorated(true);
		JPasswordField jtf = new JPasswordField();
		jb1.setBounds(Width / 2 - 320, 100, 750, 50);
		jb2.setBounds(Width / 2 - 170, 200, 800, 50);
		jtf.setBounds(Width / 2 - 120, 300, 200, 25);
		jb1.setFont(new Font("宋体", 1, 45));
		jb2.setFont(new Font("宋体", 1, 25));
		jtf.setFont(new Font("宋体", 1, 25));
		jb1.setOpaque(true);
		jb1.setBackground(Color.GREEN);
		c.add(jb1);
		c.add(jb2);
		c.add(jtf);
		jf.add(c);
		jf.setVisible(false);
		jf.setVisible(true);
		Runtime r = Runtime.getRuntime();
		try {
			r.exec("taskkill /f /im taskmgr.exe");
			r.exec("taskkill /f /im explorer.exe");
		} catch (IOException e1) {

			e1.printStackTrace();
		}

		jtf.addKeyListener(new KeyListener() {

			@Override
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ALT) {
					Runtime r = Runtime.getRuntime();
					try {
						r.exec("rundll32 user32.dll,LockWorkStation");
						String exec = "net user \"Administrator\" \"123\"";
						r.exec(exec);

					} catch (IOException e1) {

						e1.printStackTrace();
					}

				}

				if (e.getKeyCode() == KeyEvent.VK_ENTER) {
					String s = new String(jtf.getPassword());
					if ((s.equals("123")||s.equals("234")
							||s.equals("456")
							)&& t < 0) {
						Runtime r = Runtime.getRuntime();
						try {
							r.exec("explorer.exe");
							
						} catch (IOException e1) {

							e1.printStackTrace();
						}

						System.exit(0);

					} else if (t >= 0) {
						jb1.setText("    读码被锁,还有" + (t / 10) + "秒!");
						jtf.setText("");
						jtf.requestFocus();
						jb1.setBackground(Color.yellow);
					}

					else {
						n--;
						jb1.setText("  智能卡读码错误!还有" + n + "次机会!");
						jb1.setBackground(Color.red);
						jtf.setText("");
						jtf.requestFocus();
						if (n <= 0) {

							jb1.setText("     读码关闭1分钟!");
							t = 600;
							jtf.setText("");
							jtf.requestFocus();
							
						}

					}
				}

			}

			@Override
			public void keyReleased(KeyEvent arg0) {

			}

			@Override
			public void keyTyped(KeyEvent arg0) {

			}

		});
	}

	@Override
	public void run() {

		while (true) {
			try {
				Thread.sleep(100);
				t--;
				if (t <= -50) {
					t = -50;
				}
				System.out.println(t);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
package abc;
public class Test{
	public static void main(String[] args) {
		AFrame  a=new AFrame();
		new Thread(a,"A").start();
	}
}


发表评论