私が書いたプログラムがログインしているユーザー(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
これは多少試行錯誤のテストケースですが、それは(あなたがサービスをされている言及として見て、ローカルマシンを使用していますので、NULLにコンピュータ名を設定しようとしていますとにかくローカルのマシンにインストールされています)、NetUserGetInfoを使ってデータを取得して同じ問題に遭遇しようとしましたか? –
変数の種類は表示されず、変数の値は表示されません。エラーコードはあなたのユーザー名が間違っていると言います。今私たちは何を期待していますか?私たちはあなたのために何を推測するでしょうか? 'NetUserSetInfo'のパラメータをビルド中にエラーを取り除くために、ハードコードされた文字列リテラルで' NetUserSetInfo'をテストしましたか? –
char *をwchar_t *にキャストすることはできません。ユーザーの名前は中国語になります。非常にデバッガbtwで見て簡単です。 *変換*が必要です。mbstowcs()またはMultiByteToWideChar()を使用してください。または、NetUserSetInfoA()を使用します。ユーザー名に現在のコードページでエンコードできないUnicodeコードポイントが含まれているまれなケースでも、このコードは失敗します。一貫してwchar_tを使用してください。 –