编程实现Windows系统自动登录

编程实现Windows系统自动登录

原理

通过注册表修改实现。Windows内置了自动登录的机制,在登录系统时,winlogon会检查注册表下有没有设置自动登录,如果设置了就上就会读取用户名和密码,然后进行验证,通过后就登录进系统了。

方法

注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

键值:

键值 设置值 作用
AutoAdminLogon 1; 1表示自动登录,0表示禁止自动登录
DefaultDomainName 设置值 域名,如果没有就留空
DefaultUserName abc 登录系统用的用户名
DefaultPassword 123 登录系统用的用户名使用的密码,如果想加密保存就删除此键值
DontDisplayLastUserName 1  

注意,下面两个键值必须删除掉,否则会显示一个通知对话框。

  • LegalNoticeCaption
  • LegalNoticeText


另外还有2个键值,作用分别如下:

  • IgnoreShiftOverride 忽略shift键,默认在开机时按shift机会显示登录对话框(即使设置成自动登录),设置成1后,按shift键也没用了。
  • AutoLogonCount 设置自动登录次数
  • ForceAutoLogon 该值要删除掉

特别注意

由于密码是明文保存的,很不安全,所以windows中提供了一个秘密的地方来保存加密后的密码,就是在lsa中。sysinternals中autologon工具就是把密码保存进去的。 在Winlogon中,它会先到lsa中用找“DefaultPassword”的信息,找到后就用这个密码,如果找不到就到注册表下去找“DefaultPassword”值。

读写lsa的代码,这个代码是pinvoke.net 中找到的。原文:
http://www.pinvoke.net/default.aspx/advapi32/DefaultPassword.html

其中C++代码由微软提供:http://msdn.microsoft.com/en-us/library/aa378826(VS.85).aspx
C#代码为:http://www.pinvoke.net/default.aspx/advapi32/LsaRetrievePrivateData.html
获取LUAUtil类后,如下调用即可,

LSAutil lsa = new LSAutil("DefaultPassword");
lsa.SetSecret(“abc”);
Console.Write(lsa.GetSecret());

posted @ 2009-11-18 22:38  林杰的博客  阅读(3421)  评论(1编辑  收藏  举报