加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在.NET中捕获AccessViolation 4.好还是坏?

发布时间:2020-12-15 21:39:54 所属栏目:百科 来源:网络整理
导读:在文件中有类型SECURITY_IDENTIFIER结构的对象.我需要从这个结构获得所有者SID.为了做到这一点,我调用GetSecurityDescriptorOwner WinAPI函数并创建System.Security.Principal.SecurityIdentifier(它有过载以IntPtr作为参数) 问题是文件中的结构有时会被破坏
在文件中有类型SECURITY_IDENTIFIER结构的对象.我需要从这个结构获得所有者SID.为了做到这一点,我调用GetSecurityDescriptorOwner WinAPI函数并创建System.Security.Principal.SecurityIdentifier(它有过载以IntPtr作为参数)

问题是文件中的结构有时会被破坏,因此我从GetSecurityDescriptorOwner获取的指针无效.它不是IntPtr.Zero,它是无效的,所以当我创建SecurityIdentifier类型的对象时,我得到了AccessViolationException,这是不可能用简单的try-catch来捕获.NET 4.

我知道允许捕获此类异常的属性,所以我暂时使用它,但我不喜欢这个解决方案.不建议捕获Corrupted State Exceptions(CSE),但我没有看到任何其他解决方案.这个WinAPI函数返回无效指针,我看不到检查它的有效性.有任何想法吗?

更新

WinAPI的

BOOL WINAPI GetSecurityDescriptorOwner(
  _In_   PSECURITY_DESCRIPTOR pSecurityDescriptor,_Out_  PSID *pOwner,_Out_  LPBOOL lpbOwnerDefaulted
);

外部定义

[DllImport("Advapi32.dll")]
static extern bool GetSecurityDescriptorOwner(
   IntPtr pSecurityDescriptor,out IntPtr owner,out bool defaulted);

更新

private static SecurityIdentifier GetSecurityIdentifier()
{
    // Allocate managed buffer for invalid security descriptor structure (20 bytes)
    int[] b = new int[5] {1,1,1};

    // Allocate unmanaged memory for security descriptor 
    IntPtr descriptorPtr = Marshal.AllocHGlobal(b.Length);

    // Copy invalid security descriptor structure to the unmanaged buffer
    Marshal.Copy(b,descriptorPtr,b.Length);

    IntPtr ownerSid;
    bool defaulted;

    if (GetSecurityDescriptorGroup(descriptorPtr,out ownerSid,out defaulted))
    {
        // GetSecurityDescriptorGroup returns true,but `ownerSid` is `1`
        // Marshal.GetLastWin32Error returns 0 here
        return new SecurityIdentifier(ownerSid);
    }

    return null;
}

此代码抛出有时会从SecurityIdentifier构造函数中抛出Corrupted State Exceptions.有解决方案吗

解决方法

你试过调用IsValidSecurityDescriptor吗?

[DllImport("Advapi32.dll")]
static extern bool IsValidSecurityDescriptor(IntPtr pSecurityDescriptor);


if (IsValidSecurityDescriptor(descriptorPtr) && 
    GetSecurityDescriptorOwner(descriptorPtr,out defaulted))
{
     return new SecurityIdentifier(ownerSid);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读