• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:LogonUser関数が ERROR_PRIVILEGE_NOT_HELD エラーになる)

LogonUser関数でERROR_PRIVILEGE_NOT_HELDエラーが発生しました

itohhの回答

  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 >EnablePrivilege関数についてMSDNを見たのですが、載っていませんでした。 すみません、わたしが自作した関数でした。 失念していました。 改めて解説します。 MSDNライブラリの解説に >LogonUser 関数を呼び出すプロセスは、SE_TCB_NAME 特権を備えていなければなりません。 とあるように特権を動的にプログラム内から設定しなければいけません。 処理の流れとしては、以下のとおりです。 1.アクセストークンのオープン 2.Privilegeの名前に対するLUIDを取得 3.特権の設定(Enable/Disable) 4.アクセストークンのクローズ EnablePrivilege関数のサンプルを載せておきます。 (インデントするために行の先頭に全角スペースを挿入しています) この関数で一時的にSE_TCB_NAME 特権を有効にするように使ってください。 (クラスのメンバ関数としても良いと思います) BOOL EnablePrivilege(LPCTSTR pszPrivName, BOOL bEnable) {  HANDLE hToken;  TOKEN_PRIVILEGES tp;  LUID luid;  BOOL bResult = FALSE;  // アクセストークンのオープン  if (!::OpenProcessToken( ::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)){   return FALSE;  }  // Privilegeの名前に対するLUIDを取得  if (::LookupPrivilegeValue(NULL, pszPrivName, &luid)){   tp.PrivilegeCount = 1;   tp.Privileges[0].Luid = luid;   // (Enable/Disable)に応じてアトリビュートを設定する。   if( bEnable ){    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;   }   else {    tp.Privileges[0].Attributes = 0;   }   // 特権のEnable/Disableを設定   if (::AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), 0, 0) ){    bResult = TRUE;   }  }  // アクセストークンをクローズする。  ::CloseHandle(hToken);  return bResult; }

nabezo-
質問者

お礼

すみません、補足に追加があるため「お礼」で投稿します。 AdjustTokenPrivileges関数は正常終了していましたが、 GetLastError関数で確認したところ、詳細コードは以下でした。 // Not all privileges referenced are assigned to the caller. #define ERROR_NOT_ALL_ASSIGNED 1300L このため SE_TCB_NAME 特権が有効にならず、LogonUser関数も エラーになったと思われます。

nabezo-
質問者

補足

早速の回答ありがとうございました。 大変勉強になりました。 教えていただいた通りに実行したところ、 ・OpenProcessToken ・LookupPrivilegeValue ・AdjustTokenPrivileges の関数は正常終了しました。 LookupPrivilegeValue関数の第2パラメータには SE_TCB_NAME を指定しました。 しかし、LogonUser関数はエラーとなってしまいました。 エラーは同じく、ERROR_PRIVILEGE_NOT_HELD (1314) でした。 マシンにログオンしているユーザ/パスワードと LogonUser関数に渡す パラメータは同じなのですが、、、 MSDN には SE_TCB_NAME 特権がないとこのエラーになると書いてありますが 他にも要因があるのでしょうか。 お手数かけますが、心当たりあればアドバイスお願いします。

関連するQ&A

  • API  LogonUser() について

    お世話になります。 LogonUser()というAPI使いたいんです。でもこのAPIを使おうとすると、「ERROR:0x522 クライアントは要求された特権を保有していません。」というエラーが発生してしまいます。 この原因は下記のWebページにも書いてありますが、 http://www.microsoft.com/japan/developer/library/jpsecupf/_win32_LogonUser.htm 「LogonUser 関数を呼び出すプロセスは、SE_TCB_NAME 特権を備えていなければなりません。ただし、この特権を有効にしておく必要はありません。LogonUser 関数は、必要に応じてこの特権を有効にします。呼び出し側のプロセスがこの特権を備えていない場合、LogonUser 関数は失敗し、GetLastError 関数は ERROR_PRIVILEGE_NOT_HELD を返します。」ということらしいです。 しかし、プロセスに特権を持たせるというのがわからないんです。 具体的に何をどうすれば良いのでしょう。 これ一つで、丸二日間頭を抱えています。 誰かおわかりになりませんでしょうか・・・

  • WindowsNTのログオンについて.

    こんにちは.いつも参考にさせていただいております. ちょっと,助けて欲しいのですが WindowsNTをたちあげて,ユーザー名とパスワードを入力して ”ログオン”中といって起動していましたら, しばらくたって”NT Logonのサービスが開始できません” というメッセージが出てしまい,(こんなの初めてです) ログオンできない状態です. ユーザー名とパスワードは間違っていません. 2~3日前まで問題なかったのですが…. どうか,解決方法を教えてください.

  • 【Win32Api】 ERROR_BAD_UNIT のエラーとなる原因は?

    WindowsNT 4.0、VC++ 5.0 の環境です。 Win32Api の CreateFile関数でエラーとなりました。 GetLastError関数で詳細エラーを確認すると、以下のエラーでした。 ERROR_BAD_UNIT:システムは指定されたデバイスを見つけることができません ログを取ってなかったため、CreateFile関数に指定したファイル名は不明です。 以下のように再現させようとしましたが、できませんでした。 <ファイルがない> ・ERROR_FILE_NOT_FOUND <不正なパス> ・ERROR_PATH_NOT_FOUND <FDドライブを指定> ・ERROR_NOT_READY <ファイル名の先頭を「:」から書く> ・ERROR_INVALID_NAME ERROR_BAD_UNIT のエラーとなる要因は、何が考えられるでしょうか?

  • エラー表示

    メール サーバーにログオンできませんでした。 パスワードが拒否されました。 アカウント : 'pop.y.dion.ne.jp', サーバー : 'pop.y.dion.ne.jp', プロトコル : POP3, サーバーの応答 : '-ERR Logon failed', ポート : 110, セキュリティ (SSL): なし, サーバー エラー : 0x800CCC90, エラー番号 : 0x800CCC92

  • ERROR 1044

    MySQLでデータベースを作成しようと思い、 create database abc; と実行すると、 ERROR 1044 (42000): Access denied for user: ''@'localhost' to database 'abc' とエラーが表示されます。 どうしたらいいんでしょうか?

  • OEの送信がエラーになります。

    OutlookExpressのログオンが出来ません。 今まではログオンをしなくてもOEが開けましたし、送受信も出来ましたが、 急にユーザー名とパスワードを求められるようになりました。 思い付くユーザー名やパスワードを記入しましたが、いずれも拒否されます。 そのエラーを無視してOE画面を開きますと、受信は今まで通りに出来てますが 送信はエラーになります。、 パソコンはWIN XP ブロバイダーはZAQです。 サーバーエラー 0x800ccc90 エラー番号 0x8000ccc92  と表示されます。 どうしたら今まで通りにログオンをしないで送信が可能になるのでしょうか、教えて下さい。 どうぞよろしくお願い致します。

  • パスワードがエラー

    作業中に突然ダウンして再ログインしようとしたら管理者パスワードがエラーになりました。 User Profile Sarviceサービスによるログオン処理に失敗しました。 ユーザープロファイルを読み込めません。 と表記されます。

  • ASPプログラミングでADODB.Connection (0x800A0E79)エラーが発生

    ASP+MSDE 実用Webアプリケーション作成ガイド「ASP実践プログラミング入門」 と言う本を頼りにASPを勉強中です。 現在は、 (1) SQL Server2000内にDBとTable(user_info)を作成。 (2) global.asaファイルを設置。 (3) 「ユーザ登録」aspを実行。(user_infoに追加された) (4) 「ログオン」aspを実行。 と進めていますが、(4)を実行しID+パスワードを入力後に次のような エラーがブラウザ上に表示されます。 どなたかお助け頂きたくお願いします。 Q1)『ADODB.Connection (0x800A0E79)オブジェクト・・』と怒られている   ようですが、何が原因なのでしょうか? Q2) 解決に向けて調べるべき要点はどこでしょうか? ■発生したエラーはここから■ (IE上の表示です) ページを表示できません 接続しようとするページに問題があるため、そのページを表示できません。 ---------------------対処方法 ・[更新] をクリックするか、後で再度実行してください。 ・次のホームページ 1**.**.***.**6を開き、 必要な情報が記載されたページ  へのリンクを探します。 HTTP 500.100 - 内部サーバー エラー - ASP エラー インターネット インフォメーション サービス --------------------- 技術情報 (サポート担当者用) ・エラー タイプ  ADODB.Connection (0x800A0E79)  オブジェクトが開いている場合は、操作は許可されません。  /mailhen/logon.asp, line 4 ・ページ  POST 27 bytes to /mailhen/logon.asp ・POST Data:  user=mura****&pass=r*****k ■ここまで■ /mailhen/logon.asp, line 4 1:<% If Request.Form("user") <> "" Then 2: user_id = Request.Form("user") 3: password = Request.Form("pass") 4: adcn.Open Application("DBCN") 5: adrs.Open "select * from user_inf

  • アカウントのエラーについて

    とても困っております。 メールの送受信にて メール サーバーにログオンできませんでした。 パスワードが拒否されました。 アカウント : 'pop.m.dion.ne.jp', サーバー : 'pop.m.dion.ne.jp', プロトコル : POP3, サーバーの応答 : '-ERR Logon failed', ポート : 110, セキュリティ (SSL): なし, サーバー エラー : 0x800CCC90, エラー番号 : 0x800CCC92 となってしまい送受信ができません・ 解決方法をご存知のかた教えてください

  • アクセス権のチェック方法について

    あるフォルダ以下に、ユーザ毎にアクセス権が設定されたファイルがあり、指定したユーザが指定ファイルを読むことができるかをチェックするツールを作りたいと考えています。 APIを見ていて、LogonUser、ImpersonateLoggedOnUserを使ってチェックするユーザで偽装し、CreateFileでチェックするファイルを開けばよいかと思い、下記のようなコードを試しました。 ----- HANDLE hToken = NULL; HANDLE hFile = NULL; PTSTR pszUserName = "testuser"; PTSTR pszDomainName = "." PTSTR pszPassword = "testuser"; PTSTR pszFilePath = "C:\\test\\dir01\\001.txt"; try { { if (!LogonUser(pszUserName, pszDomainName, pszPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken)) { printf("error:%d\n",GetLastError()); goto leave; } hFile = CreateFile(pszFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, SECURITY_SQOS_PRESENT | SECURITY_EFFECTIVE_ONLY, NULL); if (hFile == INVALID_HANDLE_VALUE) { printf("error2:%d\n",GetLastError()); } else { printf("OK\n"); } } } leave:; } catch(...) {} ----- 実行するとLogonUser、ImpersonateLoggedOnUserは成功しているようですが、セキュリティの有無にかかわらずすべてのファイルがCreateFileに成功してしまいます。 読み取り権限が無いファイルに対してはCreateFileは失敗すると思っていましたが違うのでしょうか? それとも、セキュリティをチェックする方法として根本的に間違っています?? 情報をお待ちしております。 環境は以下の通りです。 Win2000 SP4 VisualStudio6(VC++)