天天看点

用VC实现远程修改NT帐号

作者:刘光晔

    如果我们在Windows NT Server 4.0上建立一个独立的邮件服务器,那么邮件服务器的用户同时也必须是“从批处理作业登录"权限的NT域用户,因此用户邮件账号密码(亦即NT用户密码)的更改,必须以管理员身份登录到NT才能实现,十分不便。如何才能让普通邮件用户方便自由地更改其账号密码呢?下面,笔者就用VC编写一个CGI程序,来让普通用户通过浏览器访问网页来远程修改自己的个人帐号信息。 

调用CGI程序的HTML源代码如下: 

…… 

< form method=“post" action=“/cgi-bin/ChPass.exe" > 

< table ; 

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(); 

}

用VC实现远程修改NT帐号

继续阅读