486 {
487 if (sourceSids == null)
488 {
489 throw new ArgumentNullException("sourceSids");
490 }
491 if (sourceSids.Count == 0)
492 {
494 }
500 try
501 {
502 int num = 0;
504 {
506 {
508 }
511 num++;
512 }
513 safeLsaPolicyHandle = Win32.LsaOpenPolicy(
null,
PolicyRights.POLICY_LOOKUP_NAMES);
514 someFailed = false;
515 uint num2 = global::Interop.Advapi32.LsaLookupSids(safeLsaPolicyHandle, sourceSids.Count,
array, out referencedDomains, out names);
516 switch (num2)
517 {
518 case 3221225495u:
519 case 3221225626u:
520 throw new OutOfMemoryException();
521 case 3221225506u:
522 throw new UnauthorizedAccessException();
523 case 3221225587u:
524 case 263u:
525 someFailed = true;
526 break;
527 default:
528 {
529 uint error = global::Interop.Advapi32.LsaNtStatusToWinError(num2);
531 }
532 case 0u:
533 break;
534 }
535 names.Initialize((uint)sourceSids.Count, (uint)
Marshal.
SizeOf<global::Interop.LSA_TRANSLATED_NAME>());
536 Win32.InitializeReferencedDomainsPointer(referencedDomains);
537 IdentityReferenceCollection identityReferenceCollection = new IdentityReferenceCollection(sourceSids.Count);
538 if (num2 == 0 || num2 == 263)
539 {
540 global::Interop.LSA_REFERENCED_DOMAIN_LIST lSA_REFERENCED_DOMAIN_LIST = referencedDomains.Read<global::Interop.LSA_REFERENCED_DOMAIN_LIST>(0uL);
541 string[] array3 = new string[lSA_REFERENCED_DOMAIN_LIST.Entries];
542 for (
int i = 0;
i < lSA_REFERENCED_DOMAIN_LIST.Entries;
i++)
543 {
544 global::Interop.LSA_TRUST_INFORMATION lSA_TRUST_INFORMATION =
Marshal.
PtrToStructure<global::Interop.LSA_TRUST_INFORMATION>(
new IntPtr((
long)lSA_REFERENCED_DOMAIN_LIST.Domains + i *
Marshal.
SizeOf<global::Interop.LSA_TRUST_INFORMATION>()));
545 array3[
i] =
Marshal.
PtrToStringUni(lSA_TRUST_INFORMATION.Name.Buffer, lSA_TRUST_INFORMATION.Name.Length / 2);
546 }
547 global::Interop.LSA_TRANSLATED_NAME[] array4 = new global::Interop.LSA_TRANSLATED_NAME[sourceSids.Count];
548 names.ReadArray(0uL, array4, 0, array4.Length);
549 for (int j = 0; j < sourceSids.Count; j++)
550 {
551 global::Interop.LSA_TRANSLATED_NAME lSA_TRANSLATED_NAME = array4[j];
553 {
559 {
560 string accountName =
Marshal.
PtrToStringUni(lSA_TRANSLATED_NAME.Name.Buffer, lSA_TRANSLATED_NAME.Name.Length / 2);
561 string domainName = array3[lSA_TRANSLATED_NAME.DomainIndex];
562 identityReferenceCollection.Add(new NTAccount(domainName, accountName));
563 break;
564 }
565 default:
566 someFailed = true;
567 identityReferenceCollection.Add(sourceSids[j]);
568 break;
569 }
570 }
571 }
572 else
573 {
574 for (int k = 0; k < sourceSids.Count; k++)
575 {
576 identityReferenceCollection.Add(sourceSids[k]);
577 }
578 }
579 return identityReferenceCollection;
580 }
581 finally
582 {
583 for (int l = 0; l < sourceSids.Count; l++)
584 {
585 if (array2[l].IsAllocated)
586 {
588 }
589 }
590 safeLsaPolicyHandle?.
Dispose();
591 referencedDomains?.Dispose();
592 names?.Dispose();
593 }
594 }
static unsafe? string PtrToStringUni(IntPtr ptr)
static ? object PtrToStructure(IntPtr ptr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors|DynamicallyAccessedMemberTypes.NonPublicConstructors)] Type structureType)
static int SizeOf(object structure)
static string Argument_ImproperType
static string Arg_EmptyCollection
SecurityIdentifier(string sddlForm)
unsafe IntPtr AddrOfPinnedObject()
static GCHandle Alloc(object? value)