Windows 2000では LogonUser APIが通常実行できない

Enabling and Disabling Privileges in C++ (Windows)

// Set the SeTcbPrivilege of the current process
BOOL SetSeTcbPrivilege()
{
   TOKEN_PRIVILEGES tp;
   LUID luid;
   HANDLE hProcessToken;  

   if ( !OpenProcessToken(GetCurrentProcess(),
               TOKEN_ADJUST_PRIVILEGES,
               &hProcessToken) )
   {
      _tprintf(_T("OpenProcessToken failed with error 0x%.8X\n"), GetLastError() );
      return FALSE;
   }

   if ( !LookupPrivilegeValue(
         NULL,
         SE_TCB_NAME,
         &luid ) )
   {
      _tprintf(_T("LookupPrivilegeValue failed with error 0x%.8X\n"), GetLastError() );
      CloseHandle(hProcessToken);
      return FALSE;
   }

   tp.PrivilegeCount = 1;
   tp.Privileges[0].Luid = luid;
   tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

   // Enable the privilege
   if ( !AdjustTokenPrivileges(
            hProcessToken,
            FALSE,
            &tp,
            sizeof(TOKEN_PRIVILEGES),
            (PTOKEN_PRIVILEGES) NULL,
            (PDWORD) NULL) )
   {
      _tprintf(_T("AdjustTokenPrivileges failed with error 0x%.8X\n"), GetLastError() );
      CloseHandle(hProcessToken);
      return FALSE;
   }

   CloseHandle(hProcessToken);

   if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
   {
      _tprintf(_T("The token does not have the privilege \"SeTcbPrivilege\". \n"));
      return FALSE;
   }

   return TRUE;
}

Windows 2000 で LogonUser 関数を実行すると 0xc0000022 STATUS_ACCESS_DENIED
が返ってくるのでMSDNを調べてみた所、XPでは問題ないが 2000には SE_TCB_NAME 権限を付加しないと実行できないと書かれていた

Microsoft オペレーティング システムでユーザー資格情報の認証を行う方法
ところが、強制的に権限を付加しようとするとERROR_NOT_ALL_ASSIGNED、権限が与えられていないという旨のエラーが出て権限を付加することもできないのだ。

lsa2
これを解決する方法が オペレーティングシステムの一部として機能する をユーザーグループに付加する方法なのだが
設定しても有効にならない…なんでや!

と思ったら、一回ログインしなおさないといけないらしい。
試してみた所、これで正常に動作するようになった

おすすめ

1件の返信

  1. Egtra より:

    ログオンし直さないと効かないのはハマりどころですよね。ところでLogonUserにSE_TCB_NAMEが必要なのはXP以降もそれ以降も変わっていないですよ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です