1

私のコードでは、_stat() を使用してファイルのアクセス許可を取得しようとしています。現在、Windowsで実行したいと考えています。方法は次のとおりです。

bool CFile::Private::checkPermissions(std::string sFilename, CFile::EOpenmode iOpenmode)
{
  std::string sErrMsg = "";
  bool bResult = true;
  struct _stat buf;
  int iResult = 0;

  // Get data associated with "crt_stat.c": 
  iResult = _stat( sFilename.c_str(), &buf );

  // Check if statistics are valid: 
  if( iResult != 0 )
  {
    switch (errno)
    {
      case ENOENT:
        sErrMsg = "File: " + sFilename + " not found.";
        break;
      case EINVAL:
        sErrMsg = "Invalid parameter to _stat(filename, &buf).";
        break;
      default:
        /* Should never be reached. */
        sErrMsg = "Unexpected error in _stat(filename, &buf).";
    }
    throw std::runtime_error(sErrMsg);
  }
  else
  {
    if((iOpenmode & CFile::Read) && (!(buf.st_mode & S_IREAD)))
    {
      bResult = false;
    }
    if((iOpenmode & CFile::Write) && (!(buf.st_mode & S_IWRITE)))
    {
      bResult = false;
    }
  }
  return bResult;
}

パーミッションを「false」にする唯一の方法は、ファイルの属性を「読み取り専用」に設定することです。これの代わりに、ユーザーのセキュリティ プロパティ (書き込みと読み取りを拒否) を設定すると、checkPermissions(...) に対して「true」が取得されます。Windows の属性とユーザー権限の両方を確認する方法は?

ルモ

4

2 に答える 2

6

_statは、Windows にネイティブではない機能です。これは、UNIX プログラムの Windows への移植を容易にするヘルパー関数です。ただし、UNIX ファイル モデルは Windows には当てはまらないため、すべてのフィールドが意味を成すわけではありません。たとえば、Windows にはrwxビットではなく実際の ACL があります。にすべての ACL 情報を収める方法はありませんst_mode

ACL パーミッションをテストしたい場合、適切な方法は単に試してみることです: call CreateFile()and check GetLastError(). ファイルのアクセス許可を前もって取得しようとするのは、いつでも変更される可能性があるため、信頼できません。

于 2011-05-23T08:50:34.327 に答える
1

同じ _stat() について話している場合、この MSDN の記事から、それが正確に何をするかは明らかです。基本的に、問題のファイルへのパスと _stat 構造体へのポインターを指定すると、0 が返された場合に構造体へのアクセス許可がダンプされます。

この記事のサンプル C++ コードは非常に優れています。

ユーザー権限のテストに関しては、IsUserAnAdmin()がうまく機能します。この MSDN 記事を別のアプローチに使用できる場合があります。

これが役立つことを願っています!

于 2011-05-23T08:46:56.107 に答える