2010-06-18 88 views
0

我想在C#中使用interop來獲取用戶對文件的有效權限。以下是我使用的代碼:GetEffectiveRightsFromAcl拋出無效的acl錯誤

 public static FileSystemRights GetFileEffectiveRights(string FileName, string UserName) 
    { 
     IntPtr pDacl, pZero = IntPtr.Zero; 
     int Mask = 0; 
     uint errorReturn = GetNamedSecurityInfo(FileName, SE_OBJECT_TYPE.SE_FILE_OBJECT, SECURITY_INFORMATION.Dacl 
      , out pZero, out pZero, out pDacl, out pZero, out pZero); 
     if (errorReturn != 0) 
     { 
      throw new Exception("Win error : " + errorReturn); 
     } 
     Program.TRUSTEE pTrustee = new TRUSTEE(); 
     pTrustee.pMultipleTrustee = IntPtr.Zero; 
     pTrustee.MultipleTrusteeOperation = (int)Program.MULTIPLE_TRUSTEE_OPERATION.NO_MULTIPLE_TRUSTEE; 
     pTrustee.ptstrName = UserName; 
     pTrustee.TrusteeForm = (int)Program.TRUSTEE_FORM.TRUSTEE_IS_NAME; 
     pTrustee.TrusteeType = (int)Program.TRUSTEE_TYPE.TRUSTEE_IS_USER; 
     errorReturn = GetEffectiveRightsFromAcl(pDacl, ref pTrustee, ref Mask); 
     if (errorReturn != 0) 
     { 
      throw new Exception("Win error : " + errorReturn); 
     } 
     return (FileSystemRights)Mask; 
    } 

此代碼工作正常,直到我開始修改使用類FileAccessRule和FileInfo的ACL的結構,然後我開始讓Windows錯誤1336:ERROR_INVALID_ACL。如果我調試過程,情況也是如此:我調用一次GetFileEffectiveRights,暫停過程,通過Windows API更改ACL,然後繼續並重新調用GetFileEffectiveRights(第一次調用成功,但第二次調用成功,但第二次調用1336.)
什麼問題?
PS:我正在使用VS 2008和.NET 3.5在Windows 7上開發
編輯:我只在嘗試獲取通過Windows GUI/C#添加了非繼承ACE的文件的權限時出錯文件API。

回答

1

問題出在你的問題的其他部分,它通過Windows API改變ACL。

DACL中的ACE的順序非常重要。例如,您可以在http://support.microsoft.com/kb/269175/en中找到有關正確的ACE順序和代碼示例的完整說明。

如果你仍然會有同樣的問題,只需在你的問題中發佈修改ACL的代碼示例。

+0

我使用http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.setaccesscontrol%28v=VS.100%29.aspx和http:/ http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx上的標準msdn示例代碼, /msdn.microsoft.com/en-us/library/system.io.fileinfo.setaccesscontrol.aspx更改ACL。 – apoorv020 2010-06-19 12:32:12

+0

對應於http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesecurity.aspx:「FileSecurity類隱藏了許多DACL和SACL的細節;您不必擔心ACE排序或空DACLS。「和http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.directorysecurity.aspx:「DirectorySecurity類隱藏了許多DACL和SACL的細節;您不必擔心ACE排序或空DACLS「。 ACE的類型必須正確。不過,你有一個bug的軟件。嘗試更改SD,然後在探索中進行驗證,確保不存在錯誤。 – Oleg 2010-06-19 13:15:16

+0

如果您嘗試在資源管理器中查看錯誤的Secirity Descriptor的詳細信息,那麼在出現錯誤的安全描述符時,您將看到一條錯誤消息。 – Oleg 2010-06-19 13:16:36

相關問題