2011-05-23 19 views
1

我嘗試使用_stat()獲取文件的權限。目前我想在Windows下運行它。方法如下:在我的代碼中,_stat()如何正確工作

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

_stat是一個非Windows本地的函數。它是幫助UNIX程序移植到Windows的輔助函數。但是UNIX文件模型並不適用於Windows,因此並非所有字段都有意義。例如,Windows具有真實的ACL,而不是rwx位。在st_mode中沒有適合所有ACL信息的方法。

如果要測試ACL權限,正確的方法是嘗試:請致電CreateFile()並檢查GetLastError()。試圖獲得文件權限是不可靠的,因爲他們可以隨時更改。

+0

如果文件已經打開,CreateFile忽略它的SECURITY_ATTRIBUTES arg,在這種情況下GetFileSecurity更好。 – 2016-10-25 00:14:12

0

如果我們談論相同_stat()這是從this MSDN article正是它很清楚。基本上,你爲它提供了一個有問題的文件的路徑和一個指向_stat結構體的指針,並且它將權限轉儲給結構體,如果它返回0.

本文中的示例C++代碼非常好。

至於測試用戶權限,IsUserAnAdmin()做得很好。您可以使用this MSDN article作爲其他方法。

我希望這有助於!

+2

'IsUserAnAdmin'是錯誤的方法;它完全忽略文件的ACL。而且,即使管理員也無權閱讀每個文件;它不是UNIX根目錄。 – MSalters 2011-05-23 08:52:33

相關問題