@@ -140,64 +140,63 @@ public static IEnumerable<PipeModel> GetPipes(string pipeHost = ".")
140140 var name = Marshal . PtrToStringUni ( namePtr , ( int ) fdi . FileNameLength / 2 ) ;
141141
142142 AclModel acl = null ;
143- var handle = CreateFile ( pipesPath + name , ( Kernel32 . FileAccess ) READ_CONTROL ,
144- FileShare . Read | FileShare . Write | FileShare . Delete , null , FileMode . Open , 0 , HFILE . NULL ) ;
145- if ( ! handle . IsInvalid )
143+ var err = GetNamedSecurityInfo ( pipesPath + name , SE_OBJECT_TYPE . SE_FILE_OBJECT ,
144+ SECURITY_INFORMATION . OWNER_SECURITY_INFORMATION | SECURITY_INFORMATION . GROUP_SECURITY_INFORMATION | SECURITY_INFORMATION . DACL_SECURITY_INFORMATION ,
145+ out var ownerSid , out var groupSid , out var dacl , out _ , out var sd ) ;
146+ if ( err . Succeeded )
146147 {
147- using ( handle )
148+ try
148149 {
149- var err = GetSecurityInfo ( handle . DangerousGetHandle ( ) , SE_OBJECT_TYPE . SE_FILE_OBJECT ,
150- SECURITY_INFORMATION . OWNER_SECURITY_INFORMATION | SECURITY_INFORMATION . GROUP_SECURITY_INFORMATION | SECURITY_INFORMATION . DACL_SECURITY_INFORMATION ,
151- out var ownerSid , out var groupSid , out var dacl , out _ , out _ ) ;
152- if ( err . Succeeded )
150+ int ownerNameBufLen = 1024 , groupNameBufLen = 1024 , domainBufLen = 1024 ;
151+ StringBuilder ownerNameBuf = new StringBuilder ( ownerNameBufLen ) ;
152+ StringBuilder groupNameBuf = new StringBuilder ( groupNameBufLen ) ;
153+ StringBuilder domainBuf = new StringBuilder ( domainBufLen ) ;
154+ LookupAccountSid ( null , ownerSid , ownerNameBuf , ref ownerNameBufLen , domainBuf , ref domainBufLen , out var ownerAccType ) ;
155+ LookupAccountSid ( null , groupSid , groupNameBuf , ref groupNameBufLen , null , ref domainBufLen , out var groupAccType ) ;
156+
157+ List < AclRuleModel > rules = null ;
158+ if ( dacl . IsValidAcl ( ) )
153159 {
154- int ownerNameBufLen = 1024 , groupNameBufLen = 1024 , domainBufLen = 1024 ;
155- StringBuilder ownerNameBuf = new StringBuilder ( ownerNameBufLen ) ;
156- StringBuilder groupNameBuf = new StringBuilder ( groupNameBufLen ) ;
157- StringBuilder domainBuf = new StringBuilder ( domainBufLen ) ;
158- LookupAccountSid ( null , ownerSid , ownerNameBuf , ref ownerNameBufLen , domainBuf , ref domainBufLen , out var ownerAccType ) ;
159- LookupAccountSid ( null , groupSid , groupNameBuf , ref groupNameBufLen , null , ref domainBufLen , out var groupAccType ) ;
160-
161- List < AclRuleModel > rules = null ;
162- if ( dacl . IsValidAcl ( ) )
160+ var cnt = dacl . AceCount ( ) ;
161+ rules = new List < AclRuleModel > ( ( int ) cnt ) ;
162+ for ( uint i = 0 ; i < cnt ; i ++ )
163163 {
164- var cnt = dacl . AceCount ( ) ;
165- rules = new List < AclRuleModel > ( ( int ) cnt ) ;
166- for ( uint i = 0 ; i < cnt ; i ++ )
164+ if ( GetAce ( dacl , i , out var ace ) )
167165 {
168- if ( GetAce ( dacl , i , out var ace ) )
166+ var sid = ace . GetSid ( ) ;
167+ int sidNameLen = 1024 , sidDomainLen = 1024 ;
168+ StringBuilder sidNameBuf = new StringBuilder ( sidNameLen ) ;
169+ StringBuilder sidDomainBuf = new StringBuilder ( sidDomainLen ) ;
170+ LookupAccountSid ( null , sid , sidNameBuf , ref sidNameLen , sidDomainBuf , ref sidDomainLen , out var sidAccType ) ;
171+
172+ bool isAllowing ;
173+ switch ( ace . GetHeader ( ) . AceType )
169174 {
170- var sid = ace . GetSid ( ) ;
171- int sidNameLen = 1024 , sidDomainLen = 1024 ;
172- StringBuilder sidNameBuf = new StringBuilder ( sidNameLen ) ;
173- StringBuilder sidDomainBuf = new StringBuilder ( sidDomainLen ) ;
174- LookupAccountSid ( null , sid , sidNameBuf , ref sidNameLen , sidDomainBuf , ref sidDomainLen , out var sidAccType ) ;
175-
176- bool isAllowing ;
177- switch ( ace . GetHeader ( ) . AceType )
178- {
179- case AceType . AccessAllowed :
180- isAllowing = true ;
181- break ;
182- case AceType . AccessDenied :
183- isAllowing = false ;
184- break ;
185- default :
186- continue ;
187- }
188-
189- var mask = ace . GetMask ( ) ;
190- // make Enum formatter happy, since there are no flags for 0x60 bits
191- mask &= 0xFFFFFF9F ;
192-
193- if ( sidNameBuf . Length > 0 )
194- rules . Add ( new AclRuleModel ( sidNameBuf . ToString ( ) , isAllowing , ( PipeAccessRights ) mask ) ) ;
175+ case AceType . AccessAllowed :
176+ isAllowing = true ;
177+ break ;
178+ case AceType . AccessDenied :
179+ isAllowing = false ;
180+ break ;
181+ default :
182+ continue ;
195183 }
184+
185+ var mask = ace . GetMask ( ) ;
186+ // make Enum formatter happy, since there are no flags for 0x60 bits
187+ mask &= 0xFFFFFF9F ;
188+
189+ if ( sidNameBuf . Length > 0 )
190+ rules . Add ( new AclRuleModel ( sidNameBuf . ToString ( ) , isAllowing , ( PipeAccessRights ) mask ) ) ;
196191 }
197192 }
198-
199- acl = new AclModel ( ownerNameBuf . ToString ( ) , groupNameBuf . ToString ( ) , rules ) ;
200193 }
194+
195+ acl = new AclModel ( ownerNameBuf . ToString ( ) , groupNameBuf . ToString ( ) , rules ) ;
196+ }
197+ finally
198+ {
199+ sd . Dispose ( ) ;
201200 }
202201 }
203202
0 commit comments