Skip to content

Commit 2bbced2

Browse files
committed
Simplify things a bit by using GetNamedSecurityInfo()
1 parent 68c25ee commit 2bbced2

1 file changed

Lines changed: 47 additions & 48 deletions

File tree

Native.cs

Lines changed: 47 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)