作者:劉光晔
如果我們在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();
}