C#能不能做一个软件,在登录2003系统的时候,自动输入用户名和密码

作者&投稿:戚拜 (若有异议请与网页底部的电邮联系)
C# 如何自动输入用户名密码~

c#支持域认证的,只要当前用户是用域账号登录windows的,就可以用.

网址呢,具体登录页面的网址。

一、原理

在NT/2000/XP/2003中交互式的登陆支持是由WinLogon调用GINA DLL实现的,GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。WinLogon会和GINA DLL进行交互,缺省是MSGINA.DLL(在System32目录下)。微软同时也为我们提供了接口,我们可以自己编写GINA DLL来代替MSGINA.DLL。

WinLogon初始化时会创建3个桌面:

winlogon桌面:主要显示Windows 安全等界面,如你按下CTRL+ALT+DEL,登陆的界面等

应用程序桌面:我们平时见到的那个有我的电脑的界面

屏幕保护桌面:屏幕保护显示界面。

在默认情况下,GINA显示登陆对话框,用户输入用户名及密码 。所以要获得用户名和密码 ,则可以写一个新的GINA DLL,其中提供接口调用msgina.dll的函数WlxLoggedOutSAS。

二、程序实现

GINA DLL要输出下列函数(winlogon会调用):

(表一)GINA 函数一览表

函数   描述

WlxActivateUserShell  激活用户外壳程序

WlxDisplayLockedNotice  允许GINA DLL 显示锁定信息

WlxDisplaySASNotice   当没有用户登陆时,Winlogon调用此函数

WlxDisplayStatusMessage  Winlogon 用一个状态信息调用此函数进行显示

WlxGetConsoleSwitchCredentials   Winlogon调用此函数读取当前登陆用户的信任信息,并透明地将它们传到目标会话

WlxGetStatusMessage   Winlogon 调用此函数获取当前状态信息

WlxInitialize   针对指定的窗口位置进行GINA DLL初始化

WlxIsLockOk   验证工作站正常锁定

WlxIslogoffOk   验证注销正常

WlxLoggedOnSAS   用户已登陆并且工作站没有被加锁,如果此时接收到SAS事件,则Winlogon 调用此函数

WlxLoggedOutSAS   没有用户登陆,如果此时收到SAS事件,则Winlogon 调用此函数, This indicates that a logon attempt should be made 。

WlxLogoff   请求注销操作时通知GINA DLL 

WlxNegotiate   表示当前的Winlogon版本是否能使用GINA DLL

WlxNetworkProviderLoad   在加载网络服务提供程序收集了身份和认证信息后,Winlogon 调用此函数

WlxRemoveStatusMessage   Winlogon 调用此函数告诉GINA DLL 停止显示状态信息

WlxScreensaverNotify   允许GINA与屏幕保护操作交互

WlxShutdown   在关闭之前Winlogon 调用此函数,允许GINA实现任何关闭任务,例如从读卡器中退出智能卡

WlxStartApplication   当系统需要在用户的上下文中启动应用程序时调用此函数

WlxWkstaLockedSAS  当工作站被锁定,如果接收到一个SAS,则Winlogon 调用此函数

为了简化编程,我们从MSGINA.DLL中动态获取上述函数,在自定义的DLL中(以下称为MyGina.DLL)中直接调用MSGINA.DLL的函数即可。现在我们要处理的就是WlxLoggedOutSAS函数:

int WINAPI WlxLoggedOutSAS(PVOID                pWlxContext,

         DWORD                dwSasType,

         PLUID                pAuthenticationId,

         PSID                 pLogonSid,

         PDWORD               pdwOptions,

         PHANDLE              phToken,

         PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,

         PVOID *              pProfile)

{

//=========================加入我的登陆=========================

 Clogin login;

 if (login.DoModal()==IDCANCEL)

 {

   return WLX_SAS_ACTION_NONE;

 }

 if(login.bCLOSE==TRUE)

 {

  return WLX_SAS_ACTION_SHUTDOWN;

 }

 if(login.DoModal()==IDOK)

 {

  char UserName[40];

  char PassWord[40];

  char PassWord2[40];

  

  strcpy(UserName,theApp.MyUser);

  strcpy(PassWord,theApp.MyPass);

//为了便于演示,直接在程序里面比较密码,并且把默认管理员帐号设置为自动登陆

//自动登陆函数SetAutoLogon

  strcpy(PassWord2,theApp.MyPass2);

 //  AfxMessageBox(UserName);

 //  AfxMessageBox(PassWord);  

  if(!strcmp(UserName,"Administrator"))

   if(!strcmp(PassWord,"123"))

    if(!strcmp(PassWord2,"456"))

    {

     SetAutoLogon("administrator","","123");

     return theApp.MyWlxLoggedOutSAS(pWlxContext,dwSasType,pAuthenticationId,

    pLogonSid,pdwOptions,phToken,pMprNotifyInfo,pProfile);

    }

 }

 AfxMessageBox("密码或者用户名错误!不能登陆!");

 return WLX_SAS_ACTION_NONE;

}

然后设计登陆框,实现自己的界面。本示例如图所示。

三、安装和注意事项:

(一) 在编写GIAN DLL中要注意,GINA DLL使用的是unicode。

(二) 【安装】GINA DLL的安装:

1. 添加注册表

键名 :

\HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon

变量名 : GinaDLL

变量类型 : [REG_SZ]

内容 : "你的GINA DLL的名称" 如:"MyGina.DLL:

2. 将你的GINA DLL(MyGina.dll)拷贝到系统目录下(system32);

3. 重启机器,你的GINA DLL(MyGina.dll)就会运行。

【注意】

1) 如果出现进不了你的系统,那你进入DOS后,将msgina.dll拷贝成你的GINA DLL(MyGina.dll)就可进入了;或者进入安全模式,删除掉那个键值( GinaDLL )。

2) Console 程序如果想使用MFC类,必须包含<afx.h>,同时注释掉<windows.h>。

3) 如果出现这种错误:“LINK : fatal error LNK1104: cannot open file "mfc42u.lib" ”,那么说明 lib路径的设置问题,你的链接器在指定的目录下没有找到这个的文件,你应该添加新的目录以便编译器找到所需的库文件。具体位置:IDE中菜单Tools\Options\Directories\show directories for\ <library files>。

4) 如果出现这种错误:“uafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in main.obj ”或者“mfcs42ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in main.obj ”,那么“See if you have _AFXDLL and _USRDLL in the preprocessor definitions. Try removing one of them”。具体位置:IDE中 菜单Project \ Setting \ C/C++ \ preprocessor definition 。



一、调用Windows API。

  C#调用Windows API方法如下:

  1、引入命名空间:using System.Runtime.InteropServices;

  2、引用需要使用的方法,格式:[DllImport("DLL文件")]方法的声明;

 [DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
 [DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
 [DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
 [DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd,int Msg,int wParam,int lParam);
 [DllImport("user32.dll")]
private static extern bool SetCursorPos(int X, int Y);
 [DllImport("user32.dll")]
private static extern void mouse_event(
int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
 [DllImport("user32.dll")]
private static extern void keybd_event(
byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
 [DllImport("user32.dll")]
private static extern bool SetWindowPos(
IntPtr hWnd, IntPtr hWndlnsertAfter, int X, int Y, int cx, int cy, uint Flags);
 //ShowWindow参数
 private const int SW_SHOWNORMAL = 1;
 private const int SW_RESTORE = 9;
 private const int SW_SHOWNOACTIVATE = 4;
 //SendMessage参数
 private const int WM_KEYDOWN = 0X100;
 private const int WM_KEYUP = 0X101;
 private const int WM_SYSCHAR = 0X106;
 private const int WM_SYSKEYUP = 0X105;
 private const int WM_SYSKEYDOWN = 0X104;
 private const int WM_CHAR = 0X102;
二、找到目标窗口

1)、根据窗口的标题得到句柄

 IntPtr myIntPtr = FindWindow(null,"窗口名"); //null为类名,可以用Spy++得到,也可以为空

 ShowWindow(myIntPtr, SW_RESTORE); //将窗口还原

 SetForegroundWindow(myIntPtr); //如果没有ShowWindow,此方法不能设置最小化的窗口

2)、遍历所有窗口得到句柄

1 定义委托方法CallBack,枚举窗口API(EnumWindows),得到窗口名API(GetWindowTextW)和得到窗口类名API(GetClassNameW)

 public delegate bool CallBack(int hwnd, int lParam);
 [DllImport("user32")]
public static extern int EnumWindows(CallBack x, int y);
 [DllImport("user32.dll")]
private static extern int GetWindowTextW(
IntPtr hWnd,
[MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString,
int nMaxCount);
 [DllImport("user32.dll")]
private static extern int GetClassNameW(
IntPtr hWnd,
[MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString,
int nMaxCount);
2 调用EnumWindows遍历窗口

 CallBack myCallBack = new CallBack(Recall);
 EnumWindows(myCallBack, 0);
3 回调方法Recall

 public bool Recall(int hwnd, int lParam)
 {
StringBuilder sb = new StringBuilder(256);
IntPtr PW = new IntPtr(hwnd);

GetWindowTextW(PW,sb,sb.Capacity); //得到窗口名并保存在strName中
string strName = sb.ToString();

GetClassNameW(PW,sb,sb.Capacity); //得到窗口类名并保存在strClass中
string strClass = sb.ToString();

if (strName.IndexOf("窗口名关键字") >= 0 && strClass.IndexOf("类名关键字") >= 0)
{
 return false; //返回false中止EnumWindows遍历
}
else
{
 return true; //返回true继续EnumWindows遍历
}
 }
3)、打开窗口得到句柄

1 定义设置活动窗口API(SetActiveWindow),设置前台窗口API(SetForegroundWindow)

 [DllImport("user32.dll")]
static extern IntPtr SetActiveWindow(IntPtr hWnd);
 [DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
2 打开窗口

 Process proc = Process.Start(@"目标程序路径");
 SetActiveWindow(proc.MainWindowHandle);
 SetForegroundWindow(proc.MainWindowHandle);
三、向指定的窗口输入数据

1 利用发送消息API(SendMessage)向窗口发送数据 

InputStr(myIntPtr, _GameID); //输入游戏ID
 SendMessage(myIntPtr, WM_SYSKEYDOWN, 0X09, 0); //输入TAB(0x09)
 SendMessage(myIntPtr, WM_SYSKEYUP, 0X09, 0);
 InputStr(myIntPtr, _GamePass); //输入游戏密码
 SendMessage(myIntPtr, WM_SYSKEYDOWN, 0X0D, 0); //输入ENTER(0x0d)
 SendMessage(myIntPtr, WM_SYSKEYUP, 0X0D, 0);

 /// < summary>
 /// 发送一个字符串
 /// < /summary>
 /// < param name="myIntPtr">窗口句柄< /param>
 /// < param name="Input">字符串< /param>
 public void InputStr(IntPtr myIntPtr, string Input)
 {
byte[] ch = (ASCIIEncoding.ASCII.GetBytes(Input));
for (int i = 0; i < ch.Length; i++)
{
 SendMessage(PW, WM_CHAR, ch, 0);
}
 }

2 利用鼠标和键盘模拟向窗口发送数据

 SetWindowPos(PW, (IntPtr)(-1), 0, 0, 0, 0, 0x0040 | 0x0001); //设置窗口位置
 SetCursorPos(476, 177); //设置鼠标位置
 mouse_event(0x0002, 0, 0, 0, 0); //模拟鼠标按下操作
 mouse_event(0x0004, 0, 0, 0, 0); //模拟鼠标放开操作
 SendKeys.Send(_GameID); //模拟键盘输入游戏ID
 SendKeys.Send("{TAB}"); //模拟键盘输入TAB
 SendKeys.Send(_GamePass); //模拟键盘输入游戏密码
 SendKeys.Send("{ENTER}"); //模拟键盘输入ENTER
另:上面还提到了keybd_event方法,用法和mouse_event方法类似,作用和SendKeys.Send一样。

这样,就实现了C#调用Windows API自动登录。

我想你的意思雷同于网页上的记住密码功能。
网页通常用cookie。
安装程序可以用ini文件。具体实现方法楼主可以查一下C#,INI的相关实现方法。

还有一楼纯粹胡扯。

说的很清楚了,
但我确实没看到,谁做出过这东西,
你在windows 系统 验证账户密码时候,来实现自动化? 我看不大可能...
系统不和网页一样,可以存个 cookie什么的! 2楼的朋友!!

使用注册表编程:
用c#代码这样修改注册表:[HKEY_LOCAL_MACHINE]-->[SOFTWARE]-->[Microsoft]-->[Windows NT]-->[CurrentVersion]-->将[Winlogon]右边窗口的[AutoAdminLogon]数值数据改为[1]及将[DefaultUserName]的数值数据改为[设定自动登录使用者帐户的名称],另增加一个字符串值[DefaultPassword]数值数据为[设定自动登录使用者帐户的密码]。

【注册表编程】我不熟,你网上找找吧~这办法肯定行。


泸西县19217253994: 在vs2005中,用c#做一个登录应用程序代码答案 -
袁满方希: 1,先建立一个数据库UserTest. 2,在里面建立一个表叫UsersTable,设计表,建立三个列:u_id, u_name, u_pwd. 3,u_id是int数据类型,自增1;u_name是nvarchar类型,长度12;u_pwd是varchar类型,长度12,然后保存该表. 4,打开表,在...

泸西县19217253994: 用c#写一个小windows应用程序,实现注册登陆 -
袁满方希: 请示很简单啊.你把用户名+密码做为一个字符串写到文本文件中.每次写为一行.做为保存注册信息.每次登陆时,对每一行进行扫描,分解用户名和密码,然后验证,就可以了.

泸西县19217253994: C#做桌面软件的登录功能 -
袁满方希: 直接在在C#中建立项目啊,然后直接拉取控件,在控件中输入代码.直接用数据库不行,在这里面数据库只是你用户名和密码等数据的存储和交流的地方.

泸西县19217253994: c#能不能编写WIN桌面软件? -
袁满方希: Win应用程序当然是指Windows窗口应用程序.我个人认为C#是一门写窗口应用程序比较简单,也比较好玩的语言.但我觉得它作为.NET的平台语言,肯定最为强大的功能在与Web应用,及与ASP.NET的强强联合.虽然现在C#比较热,但好像找工作JAVA要比C#好.

泸西县19217253994: c#语言能做出什么软件
袁满方希: C#基本上所有软件都可以做. 但是各个语言都有自己的适用范围. C#的范围就是应用软件,因为他的开发速度快,因此很多人都选择他. C#的弱项在于底层且执行效率略低. 例如外挂这样的频繁对内存修改就不是特别容易办到,需要调用API才可以实现. 不是不可以做,是成本太高. 再一个,像你这样就想做外挂的,那就别学C#了,直接学C++或更适合做外挂的易语言

泸西县19217253994: c#登陆界面怎么跳转到其他界面窗口,就是给一个软件做一个简单的登陆界面,求代码,求大神指点 -
袁满方希: 不好全粘出来,就给最关键的几行吧 //logger.Info(String.Format("登录成功:用户“{0}”", model.Name)); Response.Redirect("default.aspx"); //break;

泸西县19217253994: 用C#开发一个软件 -
袁满方希: 首先,C#程序的运行必须有.NET Framework框架的支持.你在装有.NET,VS的机子上可以运行主要是因为在安装VS开发环境的时候就已自动安装了.NET Framework.所以可以运行.如果要做安装包的话可以把.NET Framework框架一起打在安装包里面,然后写个壳,读注册表,查看是否安装.NET Framework,如果没安装就先安装.NET Framework,然后再安装你的程序.这办法可行,以前我也遇到这个问题,后来就是用这方法解决的.

泸西县19217253994: 想用c#做一个简单的登陆,注册界面,请问具体步骤 -
袁满方希: 网页吗 html 里面form提交 后台C# request.params["id"] 这样接收 调用数据库数据进行验证账号密码 然后根据验证结果跳转或者返回失败

泸西县19217253994: 我想用vs2005中,c#做一个登陆的页面,页面只需要判断在用户名和密码是否在access数据库中存在. -
袁满方希: 连接数据库 if( 数据库是否有该userName ) { if( 数据库相应的密码是否 = userName;) 成功登陆; else错误 password;} else 错误 username;

泸西县19217253994: 用C#语言做一个学生登陆管理系统 -
袁满方希: 不用数据库的话那内存只能存储程序运行一次的数据, 这样的话,只要创建一个储存用户注册信息的类例如class uesrInfo. 用数组定义变量,string[] userInfo=new string[100]//100表示限制注册用户个数为100, 再定义下面这些数组变...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网