15

別のユーザーの下でプロセスを作成したい。したがって、LogonUserとCreateProcessAsUserを使用します。しかし、私の問題は、CreatePtocessAsUserが常にエラーコード1314を返すことです。これは、「必要な特権がクライアントによって保持されていない」ことを意味します。だから私の質問は、私が間違っていることは何ですか?または、どうすればハンドルに特権を与えることができますか?(ハンドルに特権があるはずだと思いますか、それとも間違っていますか?)英語の間違いで申し訳ありませんが、私の英語の知識は最高ではありません:)

誰かが私のアプリケーションを修正する方法を知っているなら、助けてください。

これは私のコードの一部です。

STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;
TOKEN_PRIVILEGES tp;
memset(&ProcInfo, 0, sizeof(ProcInfo));
memset(&StartInfo, 0 , sizeof(StartInfo)); 
StartInfo.cb = sizeof(StartInfo); 
HANDLE handle = NULL;

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ALL_ACCESS, &handle)) printf("\nOpenProcessError");

if (!LookupPrivilegeValue(NULL,SE_TCB_NAME,
//SE_TCB_NAME,
&tp.Privileges[0].Luid)) {
printf("\nLookupPriv error");
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes =
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(handle, FALSE, &tp, 0, NULL, 0)) {
printf("\nAdjustToken error");
}

i = LogonUser(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &handle);
printf("\nLogonUser return  : %d",i);
i = GetLastError();
printf("\nLogonUser getlast : %d",i);
if (! ImpersonateLoggedOnUser(handle) ) printf("\nImpLoggedOnUser!");

i = CreateProcessAsUser(handle, "c:\\windows\\system32\\notepad.exe",NULL, NULL, NULL, true, 
CREATE_UNICODE_ENVIRONMENT |NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL, 
&StartInfo, &ProcInfo);    
printf("\nCreateProcessAsUser return  : %d",i);
i = GetLastError();
printf("\nCreateProcessAsUser getlast : %d",i);

CloseHandle(handle); 
CloseHandle(ProcInfo.hProcess); 
CloseHandle(ProcInfo.hThread); 

前もって感謝します!

4

4 に答える 4

18

アプリを実行しているローカルアカウントでは、ローカルセキュリティポリシーで次の権限を有効にする必要があります。

  • オペレーティングシステムの一部として機能する
  • トークンオブジェクトを作成する
  • バッチジョブとしてログオンする

編集:以下のPatelの回答を参照してください。この場合の正しい特権は次のとおりです。

  • 「プロセスレベルのトークンを交換してください」
于 2009-09-25T05:39:57.650 に答える
14

何時間も答えを探した後、最終的に MSDN の次のリンクで見つけました。将来誰かに役立つことを願っています。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c905c900-cae1-4081-b0c9-00f10238e7ad/createprocessasuser-failed?forum=clr

「この問題を解決するには、CreateProcessAsUser を呼び出すアカウントの権限を「プロセス レベル トークンの置換」権限で昇格する必要があります。これを行うには、コントロール パネル/管理ツール/ローカル セキュリティ ポリシーを開き、ユーザー アカウントを追加します。 「プロセス レベル トークンを置き換える」権限に移動します (この変更を有効にするには、ログアウトするか、再起動する必要がある場合もあります)。

于 2016-03-01T21:57:14.147 に答える
0

リンクを確認しましたが、うまくいきました。 これをチェックして

void main()
{

DWORD dwSessionId;
HANDLE hToken = NULL;

TOKEN_PRIVILEGES tp;
PROCESS_INFORMATION pi;
STARTUPINFOW si;

// Initialize structures.
ZeroMemory(&tp, sizeof(tp));
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);


LPTSTR lpszUsername = "user\0";
LPTSTR lpszDomain = ".";//"bgt\0";
LPTSTR lpszPassword = "password\0";

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY
| TOKEN_ADJUST_PRIVILEGES , &hToken)) {

MyError();
}



// Look up the LUID for the TCB Name privilege.
if (!LookupPrivilegeValue(NULL,SE_TCB_NAME, //SE_SHUTDOWN_NAME ,
//SE_TCB_NAME,
&tp.Privileges[0].Luid)) {
MyError();
}


tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes =
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, 0)) {

MyError();
}


if(LogonUser(lpszUsername,lpszDomain,lpszPassword,
LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken) == 0)
{
MyError();
}
else
{
STARTUPINFO sInfo;
PROCESS_INFORMATION ProcessInfo;
memset(&sInfo,0,sizeof(STARTUPINFO));
sInfo.cb = sizeof(STARTUPINFO);
sInfo.dwX = CW_USEDEFAULT;
sInfo.dwY = CW_USEDEFAULT;
sInfo.dwXSize = CW_USEDEFAULT;
sInfo.dwYSize = CW_USEDEFAULT;


bool bRet = CreateProcessAsUser(hToken,
"c:\\windows\\system32\\notepad.exe",
NULL,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&sInfo,
&ProcessInfo);

if(bRet == 0)
MyError();
}
于 2011-02-25T08:09:33.687 に答える
0

コードは SE_TCB_NAME 権限をトークンに追加します。

MSDN は、「通常、CreateProcessAsUser 関数を呼び出すプロセスには、SE_ASSIGNPRIMARYTOKEN_NAME および SE_INCREASE_QUOTA_NAME 特権が必要です」と述べています。

于 2009-09-25T05:57:23.387 に答える