2016-07-12 21 views
-1

私が書いたプログラムがログインしているユーザー(1人のユーザー)のパスワードを変更できるC++プログラムを作成しました。仕事と私は、古いパスワードを養う私は、コードを実行したNetUserSetInfo:「ユーザー名が見つかりませんでした」

void chpwd::initialize() // function that initialize params of NetUserSetInfo 
{ 
    cout<<"initializing"<<endl; 
    string un=getenv("USERDOMAIN"); 
    un+="\\"; 
    un+=getenv("USERNAME"); //"USERDOMAIN\USERNAME", I gave name also,since the target machine won't be in domain 
    wstring uname=wstring(un.begin(),un.end()); 
    wUserName=(wchar_t*)uname.c_str(); 
    wcout<<wUserName<<endl; 
    wComputerName=_wgetenv (L"COMPUTERNAME"); 
    wcout<<wComputerName<<endl; 
    string pw(p.genpassword()); 
    cout<<"pw "<<pw<<endl; 
    wstring pwd=wstring(pw.begin(),pw.end()); 
    wcout.flush(); 
    wNewPassword=const_cast<LPWSTR>(pwd.c_str()); 
    wcout<<wNewPassword<<endl; 

} 

bool chpwd::chngpwd() //funtion that changes password 
{ 
    initialize(); 
    do 
    { 
    pi1003.usri1003_password = wNewPassword; 
      wcout.flush(); 
      wcout<<wNewPassword<<endl; 
      nas = NetUserSetInfo(
        wComputerName, // computer name 
        wUserName,  // username 
        1003,   // info level 
        (LPBYTE)&pi1003,  // new info 
        NULL 
        ); 
     if(nas != NERR_Success) 
     { 
      DisplayErrorText(nas); 
      l.logic_log(l.time(),"Error occured while reseting password \n old password \""+p.prevp+"\" retains"); 
     } 
     Sleep(1000); 
    }while(nas != NERR_Success); 
    return 1; 

} 

以下の私のコードを見つけることしたくないされNetUserSetInfoを選んだ理由を行うための方法NetUserSetInfoは、paramsが明確に初期化されているが、私は得ていますパスワードを変更する際にThe user name could not be found.を取得していますが、これは非常に有益でしたが、このエラーは実際には起こりません。私が与えたユーザー名は正しいです。また、ドメインに属していない一部のマシンでコードを実行しました。権利は同じですが、誰かが間違ったことを私に指摘することはできますか?

は言った答えは1として、私は、変数の初期化を変更していると私は

bool chpwd::chngpwd() 
{ 
    wstring uname = _wgetenv(L"USERDNSDOMAIN"); 
    uname += L"@"; 
    uname += _wgetenv(L"USERNAME"); 
    wcout << L"un " << uname << endl;//[email protected]_G 

    wstring cname = _wgetenv (L"COMPUTERNAME"); 
    wcout << L"cn " << cname << endl;//TExxxxM 

    wstring pwd; 
    string pw = p.genpassword();//eadjbic3 
    int len = MultiByteToWideChar(CP_ACP, 0, pw.c_str(), pw.length(), NULL, 0); 
    if (len > 0) 
    { 
     pwd.resize(len); 
     MultiByteToWideChar(CP_ACP, 0, pw.c_str(), pw.length(), &pwd[0], len); 
    } 
    wcout << L"pw " << pwd << endl; 
    do 
    { 
    pi1003.usri1003_password = const_cast<LPWSTR>(pwd.c_str());; 
      //wcout.flush(); 
      //wcout<<wNewPassword<<endl; 
      nas = NetUserSetInfo(
        cname.c_str(), // computer name 
        uname.c_str(),  // username 
        1003,   // info level 
        (LPBYTE)&pi1003,  // new info 
        NULL 
        ); 
     if(nas != NERR_Success) 
     { 
      DisplayErrorText(nas); 
      l.logic_log(l.time(),"Error occured while reseting password \n old password \""+p.prevp+"\" retains"); 
     } 
     Sleep(1000); 
    }while(nas != NERR_Success); 
    return 1; 

} 

が再び変数が適切な値で得られるいくつかの情報を追加していますが、まだそれ は

を言います

user name couldn't be found

+0

これは多少試行錯誤のテストケースですが、それは(あなたがサービスをされている言及として見て、ローカルマシンを使用していますので、NULLにコンピュータ名を設定しようとしていますとにかくローカルのマシンにインストールされています)、NetUserGetInfoを使ってデータを取得して同じ問題に遭遇しようとしましたか? –

+0

変数の種類は表示されず、変数の値は表示されません。エラーコードはあなたのユーザー名が間違っていると言います。今私たちは何を期待していますか?私たちはあなたのために何を推測するでしょうか? 'NetUserSetInfo'のパラメータをビルド中にエラーを取り除くために、ハードコードされた文字列リテラルで' NetUserSetInfo'をテストしましたか? –

+1

char *をwchar_t *にキャストすることはできません。ユーザーの名前は中国語になります。非常にデバッガbtwで見て簡単です。 *変換*が必要です。mbstowcs()またはMultiByteToWideChar()を使用してください。または、NetUserSetInfoA()を使用します。ユーザー名に現在のコードページでエンコードできないUnicodeコードポイントが含まれているまれなケースでも、このコードは失敗します。一貫してwchar_tを使用してください。 –

答えて

1

wstring(iterator,iterator)を使用すると、Ansiエンコードstd::stringをUnicode std::wstringに変換する正しい方法ではありません。これはASCII文字に対してのみ正しく動作し、他の文字は正しく変換されません。代わりにMultiByteToWideChar()または同等のものを使用するか、getenv()の代わりに_wgetenv()を使用してください。

さらに重要なことは、initialize()コードをすべてchngpwd()に直接移動し、すべての中間変数を削除する必要があります。 initialize()が終了したときに範囲外になるローカル変数のデータでwUserNamewNewPasswordを初期化しています。したがって、それらはNetUserSetInfo()に渡される時点で無効なメモリを指し示したままになります。

より、このような何かを試してみてください:

bool chpwd::chngpwd() 
{ 
    wstring uname = _wgetenv(L"USERDOMAIN"); 
    uname += L"\\"; 
    uname += _wgetenv(L"USERNAME"); 
    wcout << L"un " << uname << endl; 

    wstring cname = _wgetenv (L"COMPUTERNAME"); 
    wcout << L"cn " << cname << endl; 

    wstring pwd; 
    string pw = p.genpassword(); 
    int len = MultiByteToWideChar(CP_ACP, 0, pw.c_str(), pw.length(), NULL, 0); 
    if (len > 0) 
    { 
     pwd.resize(len); 
     MultiByteToWideChar(CP_ACP, 0, pw.c_str(), pw.length(), &pwd[0], len); 
    } 
    wcout << L"pw " << pwd << endl; 

    USER_INFO_1003 pi1003; 
    pi1003.usri1003_password = const_cast<LPWSTR>(pwd.c_str()); 

    NET_API_STATUS nas; 
    do 
    { 
     nas = NetUserSetInfoW(
        cname.c_str(), // computer name 
        uname.c_str(),  // username 
        1003,   // info level 
        (LPBYTE)&pi1003,  // new info 
        NULL 
     ); 
     if (nas == NERR_Success) break; 
     DisplayErrorText(nas); 
     l.logic_log(l.time(), "Error occured while reseting password \n old password \"" + p.prevp + "\" retains"); 
     Sleep(1000); 
    } 
    while (true); 
    return 1; 
} 
関連する問題