• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アクセス権のチェック方法について)

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

このQ&Aのポイント
  • 指定したユーザが指定ファイルを読むことができるかをチェックするツールを作成したいです。
  • LogonUser、ImpersonateLoggedOnUserを使用してユーザの偽装をし、CreateFileでファイルを開けば良いです。
  • 実行するとすべてのファイルがCreateFileに成功してしまいます。ファイルの読み取り権限が無いと思っていましたが、違うのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

ファイル不存在時の件ですが、こちらではファイル不存在時にはCreateFileでエラーとなりGetLastError()が2(ERROR_FILE_NOT_FOUND)を返しています。 メイン部分は以下のとおりです、ご質問の内容とほぼ1対1に対応しているので、動作が異なることはないと思うのですが・・・   HANDLE hToken = NULL;   HANDLE hFile = NULL;   PCSTR pszUserName = m_sUser;   PCSTR pszDomainName = ".";   PCSTR pszPassword = m_sPassword;   PCSTR pszFilePath = m_sFilename;   try {     do {       if (LogonUser(pszUserName,             pszDomainName,             pszPassword,             LOGON32_LOGON_INTERACTIVE,             LOGON32_PROVIDER_DEFAULT,             &hToken)) {         if (ImpersonateLoggedOnUser(hToken)) {           hFile = CreateFile(pszFilePath,                   GENERIC_READ,                   FILE_SHARE_READ,                   NULL,                   OPEN_EXISTING,                   SECURITY_SQOS_PRESENT | SECURITY_EFFECTIVE_ONLY,                   NULL);           if (!RevertToSelf()) {             MessageBox("RevertToSelf() failed");           }           if (hFile != INVALID_HANDLE_VALUE) {             CloseHandle(hFile);             MessageBox("OK");             break;           }         }       }       CString s;       s.Format("error:%d\n",GetLastError());       MessageBox(s);     } while (0);   } catch(...) {   } なお、テストにはWindows 2000 Workstationを使用していますが、Windows XP Professionalでも同様の結果です。

tetsu_2005
質問者

お礼

私の環境では、提示いただいたサンプルでも不在ファイル指定でCreateFileが通ってしまいますが、別のPCで試したところ、不在ファイル指定でGetLastError()で2が返ってきました。 特権の設定で違いがあるのかもしれませんので、私のPCと正常動作しているPCを見比べようと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

例示されているコードを元にテストプログラムを作成し試したところ、ちゃんとLogonUserしたユーザの読み取り権限に応じてCreateFileが成功/失敗しました。 テストに用いたファイルの読み取り権限の設定が誤っている(Everyoneに読み取り権限が設定されている等)ということはありませんか。

tetsu_2005
質問者

補足

回答ありがとうございます。 pszFilePathに存在しないファイルを指定していたのが原因でした。 存在するファイルを指定するとユーザの読み取り権限に応じて正しく動作しました。 しかし、CreateFileの引数でOPEN_EXISTINGを指定するとファイルが存在しない場合は関数が失敗する、とあるのに成功しているのはなぜなのでしょうか??

すると、全ての回答が全文表示されます。
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

「LogonUser、ImpersonateLoggedOnUserを使って」とあるのですが、コードの中にImpersonateLoggedOnUserがありません。 CreateFileの前にImpersonateLoggedOnUserを実行しておかないとツール実行時のユーザ権限のままになりますから、開発者権限でツールを実行している場合、CreateFileは(たいていの場合に)成功してしまうかと思います。

tetsu_2005
質問者

補足

回答ありがとうございます。 失礼しました、サンプルにImpersonateLoggedOnUserが抜けていました。 LogonUserで取得したハンドルをImpersonateLoggedOnUserに渡しています。 ----- ・・・ if (!LogonUser(pszUserName, pszDomainName, pszPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken)) { printf("error:%d\n",GetLastError()); goto leave; } ImpersonateLoggedOnUser(hToken); hFile = CreateFile(pszFilePath, ・・・ -----

すると、全ての回答が全文表示されます。

関連するQ&A