0

誰かがこれで私を助けてくれることを願っています! 以下で説明されているのと同様の問題があります: Impersonate standard user

昇格された管理者権限で実行されるアプリケーションから標準ユーザーとしてプロセスを作成できるようにしたい ( UAC 実行レベル: requireAdministrator )。ユーザーは、管理者アカウントの 1 つから権限を借用してアプリケーションを開始します。

このユーザーのexplorer.exeプロセスへのハンドルの取得に成功し、変数m_hExplorerProcに格納されています。その後、次のように進めます。

HANDLE hProcToken = NULL;

BOOL success = OpenProcessToken(m_hExplorerProc, TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_PRIVILEGES, &hProcToken);

BOOL lookupRet = LookupPrivilegeValue(NULL, SE_ASSIGNPRIMARYTOKEN_NAME,
    &(tokenPrivs.Privileges[0].Luid));
tokenPrivs.PrivilegeCount = 1;
tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL adjustRet = AdjustTokenPrivileges(hProcToken, FALSE, &tokenPrivs, 0, NULL, NULL);

lookupRet = LookupPrivilegeValue(NULL, SE_INCREASE_QUOTA_NAME, &(tokenPrivs.Privileges[0].Luid));
tokenPrivs.PrivilegeCount = 1;
tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
adjustRet = AdjustTokenPrivileges(hProcToken, FALSE, &tokenPrivs, 0, NULL, NULL);

HANDLE hDuplicatedToken = NULL;
success = DuplicateTokenEx(hProcToken,
    TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_PRIVILEGES,
    NULL,
    SECURITY_IMPERSONATION_LEVEL::SecurityImpersonation,
    TOKEN_TYPE::TokenPrimary,
    &hDuplicatedToken);
int err = 0;
if(FALSE == success)
    err = GetLastError();

LPCTSTR appName = L"C:\\testapp.exe";

PROCESS_INFORMATION procInfo;
ZeroMemory(&procInfo, sizeof(procInfo));

STARTUPINFO startupInfo;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.wShowWindow = SW_NORMAL;
startupInfo.dwFlags = STARTF_USESHOWWINDOW;

success = CreateProcessAsUser(hDuplicatedToken, appName, NULL, NULL, NULL, FALSE,
    NORMAL_PRIORITY_CLASS | CREATE_DEFAULT_ERROR_MODE,
    NULL, L"C:\\", &startupInfo, &procInfo);

if(FALSE == success)
    err = GetLastError();

プロセスは作成されず、最後のエラーは 1314 であり、「クライアントが必要な特権を保持していません」に変換されます。

このコードでは、ダミーのアプリを実行しようとしていますが、最終的には、このユーザーによってデフォルトとして選択されたブラウザーを実行したいと考えています。誰かが私が間違っていることを知っていますか、それとも私の問題に対する別の解決策を提案していますか?

4

2 に答える 2

1

自分の質問に答えるのがクールではないことはわかっていますが、3 か月が経過しましたが、まだ誰も答えを提案していません。

関数 CreateProcessAsUser を使用して上記の問題を解決することはできませんでしたが、IShellDispatch2 インターフェイスから ShellExecute を使用して、現在の対話型ユーザーとしてプログラムを開始できる別の方法を見つけました。完全なコードは https://code.google.com/p/mulder/source/browse/trunk/Utils/nsis_stdutils/Contrib/StdUtils/ShellExecAsUser.cpp?r=327にあります。

これが同様の問題を抱えている人に役立つことを願っています!

于 2014-02-20T12:17:15.543 に答える