如下代码,就几行。为什么动态修改用户密码时,修改不成功,而如果固定写好主机名就能修改成功
char szHostName[16];  
DWORD dwSize   =   16;  
GetComputerName( szHostName, &dwSize );CString m_computerName,Password_old,Password_new;
m_computerName=szHostName;
GetDlgItemText(IDC_EDIT1,Password_old);
GetDlgItemText(IDC_EDIT2,Password_new);
MessageBox(m_computerName); //这里能正确显示microsof-e455ce
LPWSTR wComputerName;
LPWSTR CurrUserName;
LPWSTR m_Password_old;
LPWSTR m_Password_new;
wComputerName = (LPWSTR)(LPCTSTR)szHostName;// L"microsof-e455ce";这里,如果写好名字就能修改成功
CurrUserName=L"Administrator";
m_Password_old=(LPWSTR)(LPCTSTR)Password_old;
m_Password_new=(LPWSTR)(LPCTSTR)Password_new;
NET_API_STATUS nStatus;//Administrator
nStatus=NetUserChangePassword(wComputerName,CurrUserName,m_Password_old,m_Password_new);
if (nStatus == NERR_Success)
MessageBox("修改成功");
else
MessageBox("修改失败");

解决方案 »

  1.   

    wchar_t szHostName[16];  
    DWORD dwSize   =   16;  
    GetComputerNameW( szHostName, &dwSize );
      

  2.   

    char szHostName[16];改成wchar_t szHostName[16]你定义的时候是ansi编码,后来转换成宽字符编码,这样强制转换会造成密码的错位
      

  3.   

    把char szHostName[16];  
    DWORD dwSize   =   16;  
    GetComputerName( szHostName, &dwSize );
    改成wchar_t szHostName[16];  
    DWORD dwSize   =   16;  
    GetComputerNameW( szHostName, &dwSize );
      

  4.   

    你这个程序肯定还是存在编码不统一的问题。(LPWSTR)(LPCTSTR)  这样的强制转换本身就是非法的。LPCTSTR是根据环境来转换为ansi或者unicode   而LPWSTR又再次强制转换为unicode 而ansi强制转换为unicode会信息错位。得不到你本来输入的。
      

  5.   

    你debug一下,一步一步的调试,看看各个变量在哪个地方出错了。
      

  6.   

    建议你用SDK的GetDlgItemText来获取数据,然后把数据直接保存在LPTSTR中。不用CString。
      

  7.   

    对了,所修改的密码和初始密码,是通过CString传来的,能够正确获得密码,查了原因,是因为密码的转换不对