阅读:1967回复:1
事件对象的权限问题?
我想在 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 是存在的,请问一下这个问题如何解决。 |
|
沙发#
发布于: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 生成的对象了。 |
|