用VC实现远程修改NT帐号

原创 2001年08月10日 19:47:00
用VC实现远程修改NT帐号
(刘光晔 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();
}

用VC实现远程修改NT帐号

            作者:刘光晔    如果我们在Windows NT Server 4.0上建立一个独立的邮件服务器,那么邮件服务器的用户同时也必须是“从批处理作业登录"权限的NT域用户,因此用...
  • ucshng
  • ucshng
  • 2007年05月29日 18:03
  • 368

用ASP.NET如何读取NT用户名

公司有个最近要开发一个小系统,是采用ASP.NET开发,现在被一难题卡住了.         需实现功能:             用户登录进来后系统自动取得用户名,这样就不用用户再登录了,     ...
  • 21aspnet
  • 21aspnet
  • 2007年03月19日 22:51
  • 2152

VC加载NT式驱动

标 题: 【原创】编写软件动态加载NT式驱动 作 者: epluguo 时 间: 2013-07-24,23:19:30 链 接: http://bbs.pediy.com/showthread.ph...
  • whatday
  • whatday
  • 2016年07月28日 14:39
  • 1122

DbgPrint 函数流程分析

DbgPrint 函数流程分析 前言 Windows 下编写内核驱动时经常用到 DbgPrint 函数输出一些调试信息,用来辅助调试。当正在用 WinDbg 内核调试时,调试信息会输出到 WinD...
  • whatday
  • whatday
  • 2014年01月20日 12:59
  • 3443

VC里面快速调用Nt系列函数示例方法

VC里面快速调用Nt系列函数示例方法,以NtTerminateProcess结束自己为例 当初研究的目的也只是为了一个稳定通用的ring3 inline hook bypass funaddr +...
  • wangningyu
  • wangningyu
  • 2014年12月19日 19:53
  • 2693

NT式驱动安装卸载

TestDDK125096.sys #include void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject) { DbgPrint("...
  • qq125096885
  • qq125096885
  • 2015年05月20日 23:19
  • 501

Vc++(MFC)中使用ADO 连接SQL Server的(远程)

连接字符串:  _bstr_t strConnect="Provider=SQLOLEDB.1;Initial Catalog=“数据库名称”;Data Source=远程IP"; h...
  • songshu1007
  • songshu1007
  • 2014年05月09日 16:26
  • 1371

VC++ 安装驱动 详细解释

最近用C++写了一款类似android手机助手的产品,其中的一个模块功能是检测与监测android设备的设备ID,根据设备ID检索驱动并进行安装。因此搜索了好多关于驱动安装的资料,现整理如下: ...
  • yanghongche
  • yanghongche
  • 2014年02月20日 11:26
  • 1455

利用pipe执行远程机器命令的分析

标题:流光附带工具实现分析lcx    作者: Nemesis  当大家用流光发现一个空口令的administrator账户时,自然马上就会用 流光带的NTCMD.EXE在远程机器上执行命令。但是,大...
  • liswa
  • liswa
  • 2005年03月09日 14:44
  • 2120

80端口被NT kernel & System占用

 前段时间停止了Apache,结果在打开的时候发现无法打开,80端口被占用,于是win+r 运行cmd 输入netstat -ano 可以看到80端口被PID4占用,于是打开...
  • u012074791
  • u012074791
  • 2015年07月27日 17:41
  • 2749
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用VC实现远程修改NT帐号
举报原因:
原因补充:

(最多只允许输入30个字)