-1
私のC++アプリケーションでは、別のユーザーを偽装する必要があります。私はこれに次のコードを使用しています。Visual C++の偽装
try {
IntPtr tokenHandle = IntPtr(0);
bool returnValue = LogonUser(username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &tokenHandle);
if (false == returnValue) {
int ret = Marshal::GetLastWin32Error();
throw gcnew System::ComponentModel::Win32Exception(ret);
}
WindowsIdentity^ newId = gcnew WindowsIdentity(tokenHandle);
WindowsImpersonationContext^ impersonatedUser = newId->Impersonate();
//TODO access file with impersonated user rights
impersonatedUser->Undo(); // Stop impersonating the user.
if (tokenHandle != IntPtr::Zero) CloseHandle(tokenHandle); // Free the tokens.
}
catch(Exception^ ex){
}
Logon user関数は、C++コンソールアプリケーションではtrueを返しますが、Visual C++アプリケーションではfalseを返します。どちらのプロジェクトも共通言語ランタイムサポートを使用しています。どちらのプロジェクトも同じインクルードとリファレンスを持っています。
どうしますか。コンソールアプリケーションのログオン操作の場合は – Mark
がtrueを返しますが、Visual C++の場合はfalseを返します。 –
同じユーザーで両方を実行しましたか? MSDNから: "関数が失敗した場合、ゼロを返します。拡張エラー情報を取得するには、GetLastErrorを呼び出します。" GetLastErrorが返すのは何ですか? – willll