写此文,是希望有高手能用.Net下与AD相关的类或者名字空间写出类似解决方案。
需求:本系统不在两个域中的任何一个域中,但是要求验证登陆的帐号(形如 UserName@Dmain)是否在两个域中的其中的一个域中。不能建立信任域。
小技巧:利用 Net Use命令登陆的返回值,并隐藏 命令提示符的窗口。
/// <summary>
/// 向域控制器发送Net Use 命令 ,返回登陆 正确与否字符可串
/// </summary>
/// <param name="ip">域控制器IP</param>
/// <param name="Domain">域名</param>
/// <param name="strName">登陆帐号</param>
/// <param name="strPassWord">登陆密码</param>
/// <returns></returns>
public string [] StartApp( string ip, string Domain, string strName, string strPassWord)
{
Process app=new Process();
string netCMD=" use \\\\"+ip+"\\ipc$ "+strPassWord+" /user:"+Domain+"\\"+strName;
ProcessStartInfo info=new ProcessStartInfo(@"net",netCMD);
info.RedirectStandardError=true;
info.RedirectStandardOutput=true;
info.UseShellExecute=false;
info.CreateNoWindow = true;
app.StartInfo=info;
app.Start();
app.WaitForExit();
StreamReader reader=app.StandardOutput;
string ok=reader.ReadLine();
string no=app.StandardError.ReadLine();
string [] appStr=new string[2];
appStr[0]=ok;
appStr[1]=no;
this.ExitApp(ip);
return appStr;
}
/// 向域控制器发送Net Use 命令 ,返回登陆 正确与否字符可串
/// </summary>
/// <param name="ip">域控制器IP</param>
/// <param name="Domain">域名</param>
/// <param name="strName">登陆帐号</param>
/// <param name="strPassWord">登陆密码</param>
/// <returns></returns>
public string [] StartApp( string ip, string Domain, string strName, string strPassWord)
{
Process app=new Process();
string netCMD=" use \\\\"+ip+"\\ipc$ "+strPassWord+" /user:"+Domain+"\\"+strName;
ProcessStartInfo info=new ProcessStartInfo(@"net",netCMD);
info.RedirectStandardError=true;
info.RedirectStandardOutput=true;
info.UseShellExecute=false;
info.CreateNoWindow = true;
app.StartInfo=info;
app.Start();
app.WaitForExit();
StreamReader reader=app.StandardOutput;
string ok=reader.ReadLine();
string no=app.StandardError.ReadLine();
string [] appStr=new string[2];
appStr[0]=ok;
appStr[1]=no;
this.ExitApp(ip);
return appStr;
}
/// <summary>
/// 关闭Net Use到域控制器上本地的连接
/// </summary>
/// <param name="ip">域控制器的IP</param>
public void ExitApp( string ip)
{
Process app=new Process();
string netCMD=" use \\\\"+ip+"\\ipc$ /del";
ProcessStartInfo info=new ProcessStartInfo(@"net",netCMD);
info.CreateNoWindow = true;
app.StartInfo=info;
app.Start();
app.WaitForExit();
}
/// 关闭Net Use到域控制器上本地的连接
/// </summary>
/// <param name="ip">域控制器的IP</param>
public void ExitApp( string ip)
{
Process app=new Process();
string netCMD=" use \\\\"+ip+"\\ipc$ /del";
ProcessStartInfo info=new ProcessStartInfo(@"net",netCMD);
info.CreateNoWindow = true;
app.StartInfo=info;
app.Start();
app.WaitForExit();
}
/// <summary>
/// 检查用户是否是域中合法用户
/// </summary>
/// <param name="ip">域控制器IP</param>
/// <param name="Domain">域名</param>
/// <param name="strName">登陆帐号</param>
/// <param name="strPassWord">登陆密码</param>
/// <returns>返回是否连接上信息,true 连接上;false,则没有连接上</returns>
public bool CheckDomain( string ip, string Domain , string strName, string strPassWord)
{
string [] appStr=this.StartApp(ip,Domain,strName,strPassWord);
bool CheckOK=false;
if(appStr[0]!=null)
{
CheckOK=true;
}
if(appStr[1]!=null)
{
CheckOK=false;
}
return CheckOK;
}
/// 检查用户是否是域中合法用户
/// </summary>
/// <param name="ip">域控制器IP</param>
/// <param name="Domain">域名</param>
/// <param name="strName">登陆帐号</param>
/// <param name="strPassWord">登陆密码</param>
/// <returns>返回是否连接上信息,true 连接上;false,则没有连接上</returns>
public bool CheckDomain( string ip, string Domain , string strName, string strPassWord)
{
string [] appStr=this.StartApp(ip,Domain,strName,strPassWord);
bool CheckOK=false;
if(appStr[0]!=null)
{
CheckOK=true;
}
if(appStr[1]!=null)
{
CheckOK=false;
}
return CheckOK;
}
登陆按纽事件:
string
Domain1
=
System.Configuration.ConfigurationSettings.AppSettings[
"
Domain1
"
].ToString();
string IP1 = System.Configuration.ConfigurationSettings.AppSettings[ " IP1 " ].ToString();
string Domain2 = System.Configuration.ConfigurationSettings.AppSettings[ " Domain2 " ].ToString();
string IP2 = System.Configuration.ConfigurationSettings.AppSettings[ " IP2 " ].ToString();
if (Domain == Domain1)
{
if(this.CheckDomain(IP1,Domain1,strName,strPassWord)==false)
{
throw new Exception("用户名或密码出错");
}
}
else if (Domain == Domain2)
{
if(this.CheckDomain(IP2,Domain2,strName,strPassWord)==false)
{
throw new Exception("用户名或密码出错");
}
}
else
{
throw new Exception("填写的域不在域中,请检查域名是否写错");
string IP1 = System.Configuration.ConfigurationSettings.AppSettings[ " IP1 " ].ToString();
string Domain2 = System.Configuration.ConfigurationSettings.AppSettings[ " Domain2 " ].ToString();
string IP2 = System.Configuration.ConfigurationSettings.AppSettings[ " IP2 " ].ToString();
if (Domain == Domain1)
{
if(this.CheckDomain(IP1,Domain1,strName,strPassWord)==false)
{
throw new Exception("用户名或密码出错");
}
}
else if (Domain == Domain2)
{
if(this.CheckDomain(IP2,Domain2,strName,strPassWord)==false)
{
throw new Exception("用户名或密码出错");
}
}
else
{
throw new Exception("填写的域不在域中,请检查域名是否写错");
本文转自kenty博客园博客,原文链接http://www.cnblogs.com/kentyshang/archive/2006/09/05/495618.html如需转载请自行联系原作者
kenty