通达OA简易中间件(同时向OA系统和域系统增加登录帐号) .
通达OA简易中间件分成两部分:
1. OA服务器接口PHP文件
2. 桌面操作程序(exe)
实现原理:从OA获取所有配置信息(省去再一次配置的麻烦),然后通过桌面程序向AD域和OA分别增加帐号。
OA服务器接口PHP文件:负责把OA的数据配置、域配置、以及增加帐号所需要的基础数据回传给 桌机操作程序
PHP接口代码主要是返回配置的数据(部分代码),在桌面程序通过获取的HTML文件,使用正则解释 <option value=值>文本</option>。
[php]
- <?php
- if($TYPE == "gender")
- {
- echo "<option value=\"0\">男</option>";
- echo "<option value=\"1\">女</option>";
- }
- ?>
<?php
if($TYPE == "gender")
{
echo "<option value=\"0\">男</option>";
echo "<option value=\"1\">女</option>";
}
?>
桌面操作程序(exe):使用C#开发
在填写了OA的访问地址后,如 http://192.168.56.101:81/
窗体使用了异步加载的方法,好较好的用户体验。
初始化,使用代理实现异步操作
[csharp]
- //禁用状态
- gbBasicInfo.Enabled = false;
- bgOtherInfo.Enabled = false;
- btnClose.Enabled = false;
- btnSubmit.Enabled = false;
- lbMessage.Visible = true;
- //异步处理加载配置数据
- //包括域地址、MySQL帐号等
- TransmitDelegate transmit = Transmit;
- IAsyncResult asyncResult = transmit.BeginInvoke(new AccountInfo(), TransmitCallBack, transmit);
//禁用状态
gbBasicInfo.Enabled = false;
bgOtherInfo.Enabled = false;
btnClose.Enabled = false;
btnSubmit.Enabled = false;
lbMessage.Visible = true;
//异步处理加载配置数据
//包括域地址、MySQL帐号等
TransmitDelegate transmit = Transmit;
IAsyncResult asyncResult = transmit.BeginInvoke(new AccountInfo(), TransmitCallBack, transmit);
信息加载主要代码
[csharp]
- void Transmit(AccountInfo state)
- {
- #region 获取OA接口地址
- //OA地址判断是否有效
- m_oaHttpUrl = FileHelper.ReadFileByFullname(m_config);
- if (!Regex.IsMatch(m_oaHttpUrl, @"^http://([^/]+)(/?){1}quot;))
- {
- frmOAInterface frm = new frmOAInterface(m_config);
- frm.ShowDialog(this);
- frm.ShowInTaskbar = false;
- if (frm.DialogResult == DialogResult.OK)
- {
- m_oaHttpUrl = frm.OAHttpUrl;
- }
- else
- {
- Application.Exit();
- }
- }
- //追加接口地址
- if (m_oaHttpUrl.Substring(m_oaHttpUrl.Length - 1) != "/")
- {
- m_oaHttpUrl += "/";
- }
- m_oaHttpUrl += "OAMidHelper.php";
- #endregion
- #region 初始化
- Spider spider = new Spider();
- string html = "";
- MatchCollection mc = null;
- IList<OptionValue> ovs = null;
- #endregion
- try
- {
- //省略部分代码
- #region 获取性别
- SetLableMessageValue("获取性别中...");
- html = spider.GetFullHtml(m_oaHttpUrl + "?TYPE=gender", "GBK", null);
- ovs = new List<OptionValue>();
- mc = m_optionRegex.Matches(html);
- if (mc.Count == 0)
- {
- throw new Exception("无法获取性别数据,请重试。");
- }
- foreach (Match item in mc)
- {
- ovs.Add(new OptionValue(item.Result("$2"), item.Result("$1")));
- }
- cbGender.DataSource = ovs;
- cbGender.DisplayMember = "Text";
- cbGender.ValueMember = "Value";
- #endregion
- }
- catch (Exception ex)
- {
- MessageBox.Show(this, ex.Message);
- }
- }
void Transmit(AccountInfo state)
{
#region 获取OA接口地址
//OA地址判断是否有效
m_oaHttpUrl = FileHelper.ReadFileByFullname(m_config);
if (!Regex.IsMatch(m_oaHttpUrl, @"^http://([^/]+)(/?){1}quot;))
{
frmOAInterface frm = new frmOAInterface(m_config);
frm.ShowDialog(this);
frm.ShowInTaskbar = false;
if (frm.DialogResult == DialogResult.OK)
{
m_oaHttpUrl = frm.OAHttpUrl;
}
else
{
Application.Exit();
}
}
//追加接口地址
if (m_oaHttpUrl.Substring(m_oaHttpUrl.Length - 1) != "/")
{
m_oaHttpUrl += "/";
}
m_oaHttpUrl += "OAMidHelper.php";
#endregion
#region 初始化
Spider spider = new Spider();
string html = "";
MatchCollection mc = null;
IList<OptionValue> ovs = null;
#endregion
try
{
//省略部分代码
#region 获取性别
SetLableMessageValue("获取性别中...");
html = spider.GetFullHtml(m_oaHttpUrl + "?TYPE=gender", "GBK", null);
ovs = new List<OptionValue>();
mc = m_optionRegex.Matches(html);
if (mc.Count == 0)
{
throw new Exception("无法获取性别数据,请重试。");
}
foreach (Match item in mc)
{
ovs.Add(new OptionValue(item.Result("$2"), item.Result("$1")));
}
cbGender.DataSource = ovs;
cbGender.DisplayMember = "Text";
cbGender.ValueMember = "Value";
#endregion
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message);
}
}
回调成功后,把禁用的对象还原出来:
[csharp]
- void TransmitCallBack(IAsyncResult asyncResult)
- {
- gbBasicInfo.Enabled = true;
- bgOtherInfo.Enabled = true;
- btnClose.Enabled = true;
- btnSubmit.Enabled = true;
- lbMessage.Visible = false;
- }
void TransmitCallBack(IAsyncResult asyncResult)
{
gbBasicInfo.Enabled = true;
bgOtherInfo.Enabled = true;
btnClose.Enabled = true;
btnSubmit.Enabled = true;
lbMessage.Visible = false;
}
向AD域增加帐号的关键代码:
[csharp]
- #region 向AD域增加用户
- SetLableMessageValue("向AD增加帐号...");
- string ouUserName = userID + "(" + userName + ")";
- using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + addept))
- {
- DirectoryEntry entry2 = entry.Children.Add("CN=" + ouUserName, "user");
- entry2.Properties["sAMAccountName"].Add(userID);
- entry2.Properties["displayname"].Add(ouUserName);
- entry2.Properties["userPrincipalName"].Add(userID + "@" + DOMAIN_NAME);
- if (telphone.Length > 0)
- {
- entry2.Properties["telephonenumber"].Add(telphone);
- }
- entry2.Properties["company"].Add(oadept2);
- entry2.Properties["userAccountControl"].Value = 0x200;
- entry2.CommitChanges();
- entry2.Invoke("SetPassword", new object[] { password });
- entry2.CommitChanges();
- }
- #endregion
#region 向AD域增加用户
SetLableMessageValue("向AD增加帐号...");
string ouUserName = userID + "(" + userName + ")";
using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + addept))
{
DirectoryEntry entry2 = entry.Children.Add("CN=" + ouUserName, "user");
entry2.Properties["sAMAccountName"].Add(userID);
entry2.Properties["displayname"].Add(ouUserName);
entry2.Properties["userPrincipalName"].Add(userID + "@" + DOMAIN_NAME);
if (telphone.Length > 0)
{
entry2.Properties["telephonenumber"].Add(telphone);
}
entry2.Properties["company"].Add(oadept2);
entry2.Properties["userAccountControl"].Value = 0x200;
entry2.CommitChanges();
entry2.Invoke("SetPassword", new object[] { password });
entry2.CommitChanges();
}
#endregion
用于获取远程HTML的关键代码:
[csharp]
- /// <summary>
- /// 网页文件页头内容正则
- /// </summary>
- public static Regex ContentTypeTextRegex = new Regex(@"text/(\w+)", RegexOptions.IgnoreCase);
/// <summary>
/// 网页文件页头内容正则
/// </summary>
public static Regex ContentTypeTextRegex = new Regex(@"text/(\w+)", RegexOptions.IgnoreCase);
[csharp]
- /// <summary>
- /// 创建访问URL的Response
- /// </summary>
- private HttpWebResponse getWebResponse(string uri, Cookie cookie)
- {
- HttpWebRequest request = null;
- HttpWebResponse response = null;
- try
- {
- //请求
- request = HttpWebRequest.Create(uri) as HttpWebRequest;
- CookieContainer myCookieContainer = new CookieContainer();
- request.KeepAlive = true;
- request.AllowAutoRedirect = true;
- request.AllowWriteStreamBuffering = true;
- request.Referer = "http://www.lanxe.net/";
- request.Timeout = 20000;
- request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50215; fqSpider)";
- request.CookieContainer = myCookieContainer;
- //加入Cookie
- if (cookie != null)
- {
- myCookieContainer.Add(cookie);
- }
- //回应
- response = request.GetResponse() as HttpWebResponse;
- response.Cookies = myCookieContainer.GetCookies(request.RequestUri);
- if (response.StatusCode == HttpStatusCode.OK)
- {
- return response;
- }
- }
- catch
- {
- }
- //返回
- return null;
- }
/// <summary>
/// 创建访问URL的Response
/// </summary>
private HttpWebResponse getWebResponse(string uri, Cookie cookie)
{
HttpWebRequest request = null;
HttpWebResponse response = null;
try
{
//请求
request = HttpWebRequest.Create(uri) as HttpWebRequest;
CookieContainer myCookieContainer = new CookieContainer();
request.KeepAlive = true;
request.AllowAutoRedirect = true;
request.AllowWriteStreamBuffering = true;
request.Referer = "http://www.lanxe.net/";
request.Timeout = 20000;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50215; fqSpider)";
request.CookieContainer = myCookieContainer;
//加入Cookie
if (cookie != null)
{
myCookieContainer.Add(cookie);
}
//回应
response = request.GetResponse() as HttpWebResponse;
response.Cookies = myCookieContainer.GetCookies(request.RequestUri);
if (response.StatusCode == HttpStatusCode.OK)
{
return response;
}
}
catch
{
}
//返回
return null;
}
[csharp]
- /// <summary>
- /// 获取网页源代码
- /// </summary>
- public string GetFullHtml(string uri, string encodeName, Cookie cookie)
- {
- HttpWebResponse response = getWebResponse(uri, cookie);
- if (response == null)
- {
- return null;
- }
- try
- {
- //HTML容器
- StringBuilder outs = new StringBuilder();
- //判断文档是否为Text形式
- string contentType = response.Headers["Content-Type"].ToLower();
- if (ContentTypeTextRegex.IsMatch(contentType))
- {
- //网页编码
- Encoding encode;
- if (encodeName.ToLower() == "default")
- {
- encode = Encoding.Default;
- }
- else
- {
- encode = Encoding.GetEncoding(encodeName);
- }
- Stream receiveStream = response.GetResponseStream();
- StreamReader reader = new StreamReader(receiveStream, encode);
- // 每次读取1024
- char[] read = new char[1024];
- int count = reader.Read(read, 0, 1024);
- while (count > 0)
- {
- outs.Append(new String(read, 0, count));
- count = reader.Read(read, 0, 1024);
- }
- // 读取完毕
- reader.Close();
- receiveStream.Close();
- }
- return outs.ToString();
- }
- catch
- {
- }
- return null;
- }
/// <summary>
/// 获取网页源代码
/// </summary>
public string GetFullHtml(string uri, string encodeName, Cookie cookie)
{
HttpWebResponse response = getWebResponse(uri, cookie);
if (response == null)
{
return null;
}
try
{
//HTML容器
StringBuilder outs = new StringBuilder();
//判断文档是否为Text形式
string contentType = response.Headers["Content-Type"].ToLower();
if (ContentTypeTextRegex.IsMatch(contentType))
{
//网页编码
Encoding encode;
if (encodeName.ToLower() == "default")
{
encode = Encoding.Default;
}
else
{
encode = Encoding.GetEncoding(encodeName);
}
Stream receiveStream = response.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream, encode);
// 每次读取1024
char[] read = new char[1024];
int count = reader.Read(read, 0, 1024);
while (count > 0)
{
outs.Append(new String(read, 0, count));
count = reader.Read(read, 0, 1024);
}
// 读取完毕
reader.Close();
receiveStream.Close();
}
return outs.ToString();
}
catch
{
}
return null;
}