wangka
驱动牛犊
驱动牛犊
  • 注册日期2003-12-11
  • 最后登录2010-05-07
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:1965回复:1

事件对象的权限问题?

楼主#
更多 发布于:2007-10-24 19:08
我想在 system 进程中创建一个命名EVENT,为了其他进程可以访问这个EVENT,我自己建立了一个 SECURITY_DESCRIPTOR 来创建这个对象,函数如下:

BOOLEAN CreateSD( PSECURITY_DESCRIPTOR *AdminSD )
{
    ULONG                            SidLength;
    PACL                            Dacl;
    NTSTATUS                        Status;

    PISECURITY_DESCRIPTOR            SecurityDescriptor    = NULL;
    PSID                            AdminSID                = NULL;
    BOOLEAN                            bResult                    = FALSE;


    {

        ULONG                            SidLength3;
        PULONG                            SubAuthority;
        SID_IDENTIFIER_AUTHORITY        SeNtSidAuthority    = {SECURITY_NT_AUTHORITY};

        SidLength3    = RtlLengthRequiredSid( 3 );
        AdminSID    = ExAllocatePool( PagedPool, SidLength3 );
        if( AdminSID == NULL )
            return FALSE;

        Status = RtlInitializeSid( AdminSID, &SeNtSidAuthority, 3 );
        if( !NT_SUCCESS(Status) )
        {
            ExFreePool(AdminSID);
            return FALSE;
        }

        SubAuthority    = RtlSubAuthoritySid( AdminSID, 0 );
        *SubAuthority    = DOMAIN_GROUP_RID_ADMINS;
        SubAuthority    = RtlSubAuthoritySid( AdminSID, 1 );
        *SubAuthority    = DOMAIN_GROUP_RID_USERS;
        SubAuthority    = RtlSubAuthoritySid( AdminSID, 2 );
        *SubAuthority    = DOMAIN_GROUP_RID_GUESTS;
    }

    if( FALSE == RtlValidSid(AdminSID) )
    {
        ExFreePool( AdminSID );
        return FALSE;
    }

    do
    {
        SidLength            = RtlLengthSid( AdminSID );
        SecurityDescriptor    = ExAllocatePool( NonPagedPool,
                                    sizeof(SECURITY_DESCRIPTOR) + sizeof(ACL) + SidLength + sizeof(ACCESS_ALLOWED_ACE) );
        if( SecurityDescriptor == NULL )
        {
            break;
        }

        Dacl    = (PACL)( (ULONG_PTR)SecurityDescriptor + sizeof(SECURITY_DESCRIPTOR) );
        Status    = RtlCreateSecurityDescriptor( SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION );
        if( !NT_SUCCESS(Status) )
        {
            break;
        }

        Status = RtlCreateAcl( Dacl, sizeof(ACL) + SidLength + sizeof(ACCESS_ALLOWED_ACE), ACL_REVISION2 );
        if( !NT_SUCCESS(Status) )
        {
            break;
        }

        Status = RtlAddAccessAllowedAce( Dacl, ACL_REVISION, GENERIC_ALL, AdminSID );
        if( !NT_SUCCESS(Status) )
        {
            break;
        }

        Status = RtlSetDaclSecurityDescriptor( SecurityDescriptor, TRUE, Dacl, FALSE );
        if( !NT_SUCCESS(Status) )
        {
            break;
        }

        bResult = TRUE;
    }while(FALSE);


    ExFreePool( AdminSID );
    if( bResult != TRUE )
    {
        if( SecurityDescriptor != NULL )
            ExFreePool(SecurityDescriptor);

        return FALSE;
    }
    else
    {
        *AdminSD = SecurityDescriptor;
        return TRUE;
    }
}

可是其他进程仍然无法打开这个 EVENT , 返回的错误值是 EVENT 不存在,但我可以使用 winobj 看到这个 EVENT 是存在的,请问一下这个问题如何解决。
wangka
驱动牛犊
驱动牛犊
  • 注册日期2003-12-11
  • 最后登录2010-05-07
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望23点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-25 20:16
问题解决了,不是在这个函数中,是在其他地方出现的问题,上面的函数也需要修改部分地方,修改

    {

        ULONG                            SidLength2;
        PULONG                            SubAuthority;
        SID_IDENTIFIER_AUTHORITY        SeNtSidAuthority    = {SECURITY_NT_AUTHORITY};

        SidLength2    = RtlLengthRequiredSid( 2 );
        AdminSID    = ExAllocatePool( PagedPool, SidLength2 );
        if( AdminSID == NULL )
            return FALSE;

        Status = RtlInitializeSid( AdminSID, &SeNtSidAuthority, 2 );
        if( !NT_SUCCESS(Status) )
        {
            ExFreePool(AdminSID);
            return FALSE;
        }

        SubAuthority    = RtlSubAuthoritySid( AdminSID, 0 );
        *SubAuthority    = SECURITY_BUILTIN_DOMAIN_RID;
        SubAuthority    = RtlSubAuthoritySid( AdminSID, 1 );
        *SubAuthority    = DOMAIN_ALIAS_RID_ADMINS;
    }

部分后,ADMINISTRATOR 就可以访问 SYSTEM 生成的对象了。
游客

返回顶部