用VC实现远程修改NT帐号

            
作者:刘光晔

    如果我们在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(); 
}

                                                               

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值