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;
}

获得“假”权限的唯一方法是将文件的属性设置为“只读”。取而代之的是,设置用户的安全属性(拒绝写入和读取)将为 checkPermissions(...) 获得“真”。如何同时检查 Windows 的属性和用户权限?

鲁莫

4

2 回答 2

6

_stat是一个非 Windows 原生的函数。它是一个帮助将 UNIX 程序移植到 Windows 的辅助函数。但是 UNIX 文件模型并不适用于 Windows,因此并非所有字段都有意义。例如,Windows 有真正的 ACL,而不是rwx位。没有办法将所有 ACL 信息放入st_mode.

如果要测试 ACL 权限,正确的方法是尝试:调用CreateFile()并检查GetLastError(). 尝试预先获得文件权限是不可靠的,因为它们可以随时更改。

于 2011-05-23T08:50:34.327 回答
1

如果我们谈论的是同一个 _stat() ,那么从这篇 MSDN 文章中可以清楚地看到它的作用。基本上,您向它提供一个有问题的文件的路径和一个指向 _stat 结构的指针,如果它返回 0,它将转储该结构的权限。

文章中的示例 C++ 代码非常好。

至于测试用户权限,IsUserAnAdmin()做得很好。您也许可以使用此 MSDN 文章来实现不同的方法。

我希望这有帮助!

于 2011-05-23T08:46:56.107 回答