internal static extern NtStatus LsaLookupSids2( SafeLsaHandle PolicyHandle, LsaLookupOptions LookupOptions, int Count, IntPtr[] Sids, out SafeLsaMemoryBuffer ReferencedDomains, out SafeLsaMemoryBuffer Names );
private static NtResult <IEnumerable <SidName> > LookupSids2(string system_name, Sid[] sids, LsaLookupOptions options, bool throw_on_error) { using (var policy = SafeLsaHandle.OpenPolicy(system_name, Policy.LsaPolicyAccessRights.LookupNames, throw_on_error)) { if (!policy.IsSuccess) { return(policy.Cast <IEnumerable <SidName> >()); } using (var list = new DisposableList()) { var sid_ptrs = sids.Select(s => list.AddSid(s).DangerousGetHandle()).ToArray(); var status = SecurityNativeMethods.LsaLookupSids2(policy.Result, options, sid_ptrs.Length, sid_ptrs, out SafeLsaMemoryBuffer domains, out SafeLsaMemoryBuffer names); if (!status.IsSuccess()) { if (status == NtStatus.STATUS_NONE_MAPPED) { list.Add(domains); list.Add(names); } return(status.CreateResultFromError <IEnumerable <SidName> >(throw_on_error)); } return(GetSidNames(sids, domains, names).CreateResult()); } } }