找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2323|回复: 1
打印 上一主题 下一主题
收起左侧

练习作品 -> Windows 自动登录小工具 V1.0

[复制链接]
跳转到指定楼层
楼主
ID:71922 发表于 2015-1-11 00:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在网上下载了一个Windows 自动登录器,觉得挺好玩的。发现它是修改注册表实现自动登录。自己也就试试写一个玩玩。
程序界面:


实现原理,修改注册表键值
=========================================================================================================

在运行中输入:regedit 打开注册表编辑器:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon主键
要求:指定的自动登陆帐号至少是user级别用户;
前三项键值是必须要有的:
----autoadminlogon,键值为1,用于设置是否可以自动登陆;键值为0,则反之
----defaultusername:键值为自动登陆默认的用户名;
----defaultpassword: 键值为自动登陆用户的密码;
----defaultdomainname:键值为自动登陆的计算机名称或者登陆网络的域名;
----ForceAutoLogon的字符串值,并将这个值设为1,这样系统即便是在注销之后也会自动登录到指定的账户;
----在默认情况下,在启动时可以按住Shift键来阻止自动登录,要消除Shift键对自动登录的影响,可以添加一个名为IgnoreShiftOverride的字符串值,并将该值设为1;
----添加AutoLogonCount的DWORD值,可以设置希望自动登录的次数

=========================================================================================================
初始化代码 在 OnInitDialog() 末尾(return TRUE; 前)加入:

  // 获取当前用户名
char User[MAX_PATH];
DWORD Size = MAX_PATH;
if (GetUserName(User,&Size)) // 获取用户名
  SetDlgItemText(IDC_Name , User); // 显示在编辑框中
else
  SetDlgItemText(IDC_Name , "自动获取用户名失败,请输入用户名");
HKEY RegKey;
char temp[MAX_PATH]; // 获取键值存放缓冲区
DWORD dwtype;   // 键值类型
DWORD sl = MAX_PATH; // 缓冲区大小
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",0, KEY_ALL_ACCESS, &RegKey))
{
  RegQueryValueEx(RegKey,"AutoAdminLogon",NULL,&dwtype,(LPBYTE)temp,&sl);
  if (strcmp("1",(char *)temp) == 0) // 判断 AutoAdminLogon 是否为 1
   SetDlgItemText(IDC_ZT,"温馨提示:检测到系统已经是自动登录状态!");
  else
   SetDlgItemText(IDC_ZT,"系统尚未设置自动登录!");
}=========================================================================================================
修改注册表函数:
// 参数:设置、取消,注销生效,屏蔽Shift键,用户名,密码:返回 1 为失败 0 为成功
int Reg(int i, int zhux, int Shift, char User[], char Password[])
{
HKEY RegKey;
char AutoUser[] = "DefaultUserName"; // 用户名
char AutoPass[] = "Defaultpassword"; // 密码
char Auto[] = "AutoAdminLogon";   // 1 自动登录
char Autozhux[] = "ForceAutoLogon";  // 注销时有效
char AutoShift[] = "IgnoreShiftOverride"; // 消除Shift键对自动登录的影响
if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",0, KEY_ALL_ACCESS, &RegKey))
  return 1;
if (i) // 设置
{
  char T='1';
  RegSetValueEx(RegKey, AutoUser, 0, REG_SZ, (LPBYTE)User, strlen(User));    // 设置用户名
  RegSetValueEx(RegKey, AutoPass, 0, REG_SZ, (LPBYTE)Password, strlen(Password));  // 设置密码
   
  if (!zhux) // 如果没有勾选 注销无效复选框 则设置注销有效
   RegSetValueEx(RegKey, Autozhux, 0, REG_SZ, (const BYTE *)&T, 1);
  else
   RegDeleteValue(RegKey, Autozhux);

  if (!Shift) // 如果没有勾选 不屏蔽Shift 键 则设置屏蔽Shift键
   RegSetValueEx(RegKey, AutoShift, 0, REG_SZ, (const BYTE *)&T, 1);
  else
   RegDeleteValue(RegKey, AutoShift);
  
  if (RegSetValueEx(RegKey, Auto, 0, REG_SZ, (const BYTE *)&T, 1)) // 只判断关键的注册表值就行啦
   return 1;   
}
else // 取消
{
  RegDeleteValue(RegKey, AutoUser); // 删除用户名键值
  RegDeleteValue(RegKey, AutoPass); // 删除密码键值
  RegDeleteValue(RegKey, Autozhux); // 删除注销有效键值
  RegDeleteValue(RegKey, AutoShift); // 删除屏蔽Shift 键值
  if (RegDeleteValue(RegKey, Auto)) // 删除自动登录
   return 1;
}
RegCloseKey(RegKey);
return 0;
}=========================================================================================================
【自动登录】按键触发代码:
void CWindowsDlg::OnAutoAdd()
{
// TODO: Add your control notification handler code here
char User[MAX_PATH]; // 存储 用户名 编辑框中数据的缓冲区
char Password[MAX_PATH]; // 存储 密码 编辑框中数据的缓冲区
GetDlgItemText(IDC_Name, User, MAX_PATH); // 获取 用户名 编辑框中的缓冲区
GetDlgItemText(IDC_Password, Password, MAX_PATH); // 获取 密码 编辑框中的缓冲区
CButton    *pButton; // 定义对象
    pButton   =    (CButton    *)GetDlgItem(IDC_ZX);  //获得指定IDcheckbox对象引用,并转换为CButton对象
int zhux = pButton->GetCheck();//获得checkbox的点击状态,值只有0 1 2三种状态,点击后为非0值
pButton   =    (CButton    *)GetDlgItem(IDC_Shift);
int Shift = pButton->GetCheck();

char temp[50] = "设置 Windows 自动登录"; // 状态显示
if (!Reg(1,zhux,Shift,User,Password))
{
  strcat(temp,"成功!");
  if (!zhux) // 如果没有勾选 注销无效
   strcat(temp," 注销时有效!");
  if (!Shift) // 如果没有勾选 不屏蔽Shift 键
   strcat(temp," 屏蔽Shift 键的影响!");

  SetDlgItemText(IDC_ZT, temp); // 显示状态
  MessageBox("设置 Windows 自动登录成功! ", "OK", MB_ICONASTERISK | MB_SYSTEMMODAL);
}
else
{
  SetDlgItemText(IDC_ZT, "设置 Windows 自动登录失败!");
  MessageBox("设置 Windows 自动登录失败!可能是由于安全软件的拦截或权限原因! ", "ERROR", MB_ICONWARNING | MB_SYSTEMMODAL);
}
}
=========================================================================================================
【取消自动】按键触发代码:
void CWindowsDlg::OnAutoDel()
{
// TODO: Add your control notification handler code here
if (!Reg(0,NULL,NULL,NULL,NULL))
{
  SetDlgItemText(IDC_ZT, "取消 Windows 自动登录成功!");
  MessageBox("取消 Windows 自动登录成功! ", "OK", MB_ICONASTERISK | MB_SYSTEMMODAL);
}
else
{
  SetDlgItemText(IDC_ZT, "取消 Windows 自动登录失败!");
  MessageBox("取消 Windows 自动登录失败! 可能由于安全软件的拦截 或 早就取消 Windows自动登录! ", "ERROR",MB_ICONWARNING | MB_SYSTEMMODAL);
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:71922 发表于 2015-1-11 00:33 | 只看该作者
2.0改进:    在 V1.0 的版本上增加一个登录的 计算机名称或域名 的功能  也是通过修改注册表实现的    应网友要求,并未加入自校验...

程序界面:  
给出一份关键代码:
// 参数:设置、取消,注销生效,屏蔽Shift键,用户名,密码:返回 1 为失败 0 为成功
int Reg(int i, int zhux, int Shift, char User[], char Password[],char PCname[])
{
        HKEY RegKey;

        char AutoUser[]  = "DefaultUserName";                // 用户名
        char AutoPass[]  = "Defaultpassword";                // 密码
        char Auto[]                 = "AutoAdminLogon";                // 1 自动登录
        char Autozhux[]  = "ForceAutoLogon";                // 注销时有效
        char AutoShift[] = "IgnoreShiftOverride";        // 消除Shift键对自动登录的影响
        char PCName[]         = "defaultdomainname";                // 计算机名称或域名

        if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",0, KEY_ALL_ACCESS, &RegKey))
                return 1;

        if (i)        // 设置
        {       
                char T='1';

                RegSetValueEx(RegKey, AutoUser, 0, REG_SZ, (LPBYTE)User, strlen(User));                                // 设置用户名
                RegSetValueEx(RegKey, AutoPass, 0, REG_SZ, (LPBYTE)Password, strlen(Password));                // 设置密码
       
                if (strcmp(PCname,"无法获得计算机名")!=0)
                {
                        RegSetValueEx(RegKey, PCName, 0, REG_SZ, (LPBYTE)PCname, strlen(PCname));                // 设置计算机名或域名
                }
                       
                if (!zhux)        // 如果没有勾选 注销无效复选框 则设置注销有效
                        RegSetValueEx(RegKey, Autozhux, 0, REG_SZ, (const BYTE *)&T, 1);
                else
                        RegDeleteValue(RegKey, Autozhux);
       
                if (!Shift)        // 如果没有勾选 不屏蔽Shift 键 则设置屏蔽Shift键
                        RegSetValueEx(RegKey, AutoShift, 0, REG_SZ, (const BYTE *)&T, 1);
                else
                        RegDeleteValue(RegKey, AutoShift);
               
                if (RegSetValueEx(RegKey, Auto, 0, REG_SZ, (const BYTE *)&T, 1))        // 只判断关键的注册表值就行啦
                        return 1;                       
        }
        else        // 取消
        {
                RegDeleteValue(RegKey, AutoUser);        // 删除用户名键值
                RegDeleteValue(RegKey, AutoPass);        // 删除密码键值
                RegDeleteValue(RegKey, Autozhux);        // 删除注销有效键值
                RegDeleteValue(RegKey, AutoShift);        // 删除屏蔽Shift 键值
                RegDeleteValue(RegKey, PCName);                // 删除计算机名或域名
                if (RegDeleteValue(RegKey, Auto))        // 删除自动登录
                        return 1;
        }
        RegCloseKey(RegKey);
        return 0;
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表