用VC实现远程修改NT帐号
(刘光晔 2001年07月16日 16:12)
如果我们在Windows NT Server 4.0上建立一个独立的邮件服务器,那么邮件服务器的用户同时也必须是“从批处理作业登录"权限的NT域用户,因此用户邮件账号密码(亦即NT用户密码)的更改,必须以管理员身份登录到NT才能实现,十分不便。如何才能让普通邮件用户方便自由地更改其账号密码呢?下面,笔者就用VC编写一个CGI程序,来让普通用户通过浏览器访问网页来远程修改自己的个人帐号信息。
调用CGI程序的HTML源代码如下:
该页面以POST方式调用ChPass.exe CGI程序更改 Windows NT 用户口令。
接下来,我们再来看看实现远程修改帐号功能的VC源程序 ,在本程序中,用户的输入先被转化为Unicode形式,解码后作为调用API函数的参数。首先,在VC中新建Win32控制台应用工程ChPass,部分代码如下。:
(刘光晔 2001年07月16日 16:12)
如果我们在Windows NT Server 4.0上建立一个独立的邮件服务器,那么邮件服务器的用户同时也必须是“从批处理作业登录"权限的NT域用户,因此用户邮件账号密码(亦即NT用户密码)的更改,必须以管理员身份登录到NT才能实现,十分不便。如何才能让普通邮件用户方便自由地更改其账号密码呢?下面,笔者就用VC编写一个CGI程序,来让普通用户通过浏览器访问网页来远程修改自己的个人帐号信息。
调用CGI程序的HTML源代码如下:
…… < form method=“post" action=“/cgi-bin/ChPass.exe" > < table border=1 > < tr >< td >用户名:< /td >< td > < input name=User maxlength=20 >< /td >< /tr > < tr >< td >口令:< /td >< td > < input name=Password type=password maxlength=20 > < /td >< /tr > < tr >< td >新口令:< /td >< td > < input name=NewPassword1 type=password maxlegth=20 > < /td >< /tr > < tr >< td >确认新口令:< /td >< td > < input name=NewPassword2 type=password maxlength=20 > < /td >< /tr > …… |
该页面以POST方式调用ChPass.exe CGI程序更改 Windows NT 用户口令。
接下来,我们再来看看实现远程修改帐号功能的VC源程序 ,在本程序中,用户的输入先被转化为Unicode形式,解码后作为调用API函数的参数。首先,在VC中新建Win32控制台应用工程ChPass,部分代码如下。:
…… void PrintMIMEHeader(){ cout < < “Content-Type: text/html/n/n"; } void PrintHTMLHeader(){ cout < < “< html >< head >< title > 用户口令更改< /title >< /head >< body >"; } void PrintHTMLTrailer(){ cout < < “< /body >< /html >"; } void GetPOSTData(){ // 从STDIN中取得表单输入 char* pContentLength; int iContentLength; pContentLength=getenv(“CONTENT_LENGTH"); if (pContentLength != NULL) iContentLength=atoi(pContentLength) else iContentLength=0; if (iContentLength >sizeof(szBuffer)-1) iContentLength=sizeof(szBuffer)1; int i=0; while (i< iContentLength){ WCHAR x=fgetwc(stdin); if (x == EOF) break; szBuffer[i ++ ]=x; } szBuffer[i]=‘/0'; } //对URL编码进行解码 void ProcessData(){ PWCHAR p; PWCHAR sep=(PWCHAR)“&"; User=wcstok(szBuffer,sep); if (User != NULL) Password=wcstok(NULL,sep); if (Password!=NULL) NewPassword1=wcstok(NULL,sep); if (NewPassword1!=NULL) NewPassword2=wcstok(NULL,sep); p=wcsstr(User,L“User="); if(p) wcscpy(User,p+5); else User=NULL; p=wcsstr(Password,L“Password="); if(p) wcscpy(Password,p+9); else Password=NULL; p=wcsstr(NewPassword1,L“NewPassword1="); if(p) wcscpy(NewPassword1,p+13); else NewPassword1=NULL; p=wcsstr(NewPassword2,L“NewPassword2="); if(p) wcscpy(NewPassword2,p+13); else NewPassword2=NULL; } //调用API函数更改口令 NET_API_STATUS ChangePassword(){ return NetUserChangePassword (NULL,User,Password,NewPassword1); //NULL为用户所属服务器 //User为用户账户名 //Password为旧密码 //NewPassword1为新密码 //函数返回值为NET_API_STATUS类型 } void main(){ char* pRequestMethod; pRequestMethod=getenv (“REQUEST_METHOD"); if (pRequestMethod == NULL){ cout < < “This program is designed to run as a CGI script/n"; return; } //限定以表单提交的形式执行CGI程式, 否则将页面重定向到输入表单 if (strcmp(pRequestMethod,“POST") != 0){ cout < < “Location: /changePass.htm/n/n"; return; } PrintMIMEHeader(); PrintHTMLHeader(); GetPOSTData(); ProcessData(); if(wcscmp(NewPassword1,NewPassword2)== 0) { switch(ChangePassword()){ case NERR_Success: cout < < “< center > < h2 >成功更改用户密码。< /h2 >"; break; case ERROR_ACCESS_DENIED: cout < < “< center >< h2 > 密码更改失败:拒绝访问。< /h2 >"; break; case ERROR_INVALID_PASSWORD: cout < < “< center >< h2 > 密码更改失败:无效的密码。< /h2 >"; break; case NERR_UserNotFound: cout < < “< center >< h2 > 密码更改失败:不存在该用户。< /h2 >"; break; case NERR_PasswordTooShort : cout < < “< center >< h2 >密码更改失败: 新密码不合要求,请选择新的密码。< /h2 >"; break; default: cout < < “< center >< h2 >密码更改失败。< /h2 >"; } } else cout < < “< center >< h2 >密码更改失败: 两次输入新口令不一致。< /h2 >"; PrintHTMLTrailer(); } |