@@ -107,8 +107,71 @@ private static T PtrToStruct<T>(IntPtr p)
107107 {
108108 return ( T ) Marshal . PtrToStructure ( p , typeof ( T ) ) ;
109109 }
110+
111+ public static AclModel GetAcl ( string path )
112+ {
113+ var err = GetNamedSecurityInfo ( path , SE_OBJECT_TYPE . SE_FILE_OBJECT ,
114+ SECURITY_INFORMATION . OWNER_SECURITY_INFORMATION | SECURITY_INFORMATION . GROUP_SECURITY_INFORMATION | SECURITY_INFORMATION . DACL_SECURITY_INFORMATION ,
115+ out var ownerSid , out var groupSid , out var dacl , out _ , out var sd ) ;
116+ if ( ! err . Succeeded )
117+ return null ;
118+
119+ try
120+ {
121+ int ownerNameBufLen = 1024 , groupNameBufLen = 1024 , domainBufLen = 1024 ;
122+ StringBuilder ownerNameBuf = new StringBuilder ( ownerNameBufLen ) ;
123+ StringBuilder groupNameBuf = new StringBuilder ( groupNameBufLen ) ;
124+ StringBuilder domainBuf = new StringBuilder ( domainBufLen ) ;
125+ LookupAccountSid ( null , ownerSid , ownerNameBuf , ref ownerNameBufLen , domainBuf , ref domainBufLen , out var ownerAccType ) ;
126+ LookupAccountSid ( null , groupSid , groupNameBuf , ref groupNameBufLen , null , ref domainBufLen , out var groupAccType ) ;
127+
128+ List < AclRuleModel > rules = null ;
129+ if ( dacl . IsValidAcl ( ) )
130+ {
131+ var cnt = dacl . AceCount ( ) ;
132+ rules = new List < AclRuleModel > ( ( int ) cnt ) ;
133+ for ( uint i = 0 ; i < cnt ; i ++ )
134+ {
135+ if ( GetAce ( dacl , i , out var ace ) )
136+ {
137+ var sid = ace . GetSid ( ) ;
138+ int sidNameLen = 1024 , sidDomainLen = 1024 ;
139+ StringBuilder sidNameBuf = new StringBuilder ( sidNameLen ) ;
140+ StringBuilder sidDomainBuf = new StringBuilder ( sidDomainLen ) ;
141+ LookupAccountSid ( null , sid , sidNameBuf , ref sidNameLen , sidDomainBuf , ref sidDomainLen , out var sidAccType ) ;
142+
143+ bool isAllowing ;
144+ switch ( ace . GetHeader ( ) . AceType )
145+ {
146+ case AceType . AccessAllowed :
147+ isAllowing = true ;
148+ break ;
149+ case AceType . AccessDenied :
150+ isAllowing = false ;
151+ break ;
152+ default :
153+ continue ;
154+ }
155+
156+ var mask = ace . GetMask ( ) ;
157+ // make Enum formatter happy, since there are no flags for 0x60 bits
158+ mask &= 0xFFFFFF9F ;
159+
160+ if ( sidNameBuf . Length > 0 )
161+ rules . Add ( new AclRuleModel ( sidNameBuf . ToString ( ) , isAllowing , ( PipeAccessRights ) mask ) ) ;
162+ }
163+ }
164+ }
165+
166+ return new AclModel ( ownerNameBuf . ToString ( ) , groupNameBuf . ToString ( ) , rules ) ;
167+ }
168+ finally
169+ {
170+ sd . Dispose ( ) ;
171+ }
172+ }
110173
111- public static IEnumerable < PipeModel > GetPipes ( string pipeHost = "." )
174+ public static IEnumerable < PipeModel > GetPipes ( bool readAcls , string pipeHost = "." )
112175 {
113176 IntPtr dir , tmp ;
114177 bool isFirstQuery = true ;
@@ -140,65 +203,8 @@ public static IEnumerable<PipeModel> GetPipes(string pipeHost = ".")
140203 var name = Marshal . PtrToStringUni ( namePtr , ( int ) fdi . FileNameLength / 2 ) ;
141204
142205 AclModel acl = null ;
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 )
147- {
148- try
149- {
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 ( ) )
159- {
160- var cnt = dacl . AceCount ( ) ;
161- rules = new List < AclRuleModel > ( ( int ) cnt ) ;
162- for ( uint i = 0 ; i < cnt ; i ++ )
163- {
164- if ( GetAce ( dacl , i , out var ace ) )
165- {
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 )
174- {
175- case AceType . AccessAllowed :
176- isAllowing = true ;
177- break ;
178- case AceType . AccessDenied :
179- isAllowing = false ;
180- break ;
181- default :
182- continue ;
183- }
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 ) ) ;
191- }
192- }
193- }
194-
195- acl = new AclModel ( ownerNameBuf . ToString ( ) , groupNameBuf . ToString ( ) , rules ) ;
196- }
197- finally
198- {
199- sd . Dispose ( ) ;
200- }
201- }
206+ if ( readAcls )
207+ acl = GetAcl ( pipesPath + name ) ;
202208
203209 yield return new PipeModel ( pipeHost , name , ( int ) fdi . AllocationSize . LowPart , fdi . EndOfFile . LowPart , acl ) ;
204210
0 commit comments