@@ -575,12 +575,23 @@ NTSTATUS kuhl_m_net_serverinfo(int argc, wchar_t * argv[])
575575
576576const PCWCHAR TRUST_ATTRIBUTES_FLAGS [] = {L"IN_FOREST" , L"DIRECT_OUTBOUND" , L"TREE_ROOT" , L"PRIMARY" , L"NATIVE_MODE" , L"DIRECT_INBOUND" };
577577const PCWCHAR TRUST_ATTRIBUTES [] = {L"NON_TRANSITIVE" , L"UPLEVEL_ONLY" , L"FILTER_SIDS/QUARANTINED_DOMAIN" , L"FOREST_TRANSITIVE" , L"CROSS_ORGANIZATION" , L"WITHIN_FOREST" , L"TREAT_AS_EXTERNAL" , L"TRUST_USES_RC4_ENCRYPTION" , L"TRUST_USES_AES_KEYS" };
578+ const PCWCHAR TRUST_DIRECTION [] = {L"DISABLED" , L"INBOUND" , L"OUTBOUND" , L"BIDIRECTIONAL" };
578579NTSTATUS kuhl_m_net_trust (int argc , wchar_t * argv [])
579580{
580581 PDS_DOMAIN_TRUSTS pTrusts ;
581582 ULONG uTrusts ;
582583 DWORD ret , i , j ;
583- ret = DsEnumerateDomainTrusts (argc ? argv [0 ] : NULL , DS_DOMAIN_VALID_FLAGS , & pTrusts , & uTrusts );
584+ PWCHAR server , dn , sysDN , pAttribute , myAttrs [] = {L"trustPartner" , L"flatName" , L"trustAttributes" , L"trustDirection" , L"trustType" , L"objectGUID" , NULL };
585+ PLDAP ld ;
586+ PLDAPMessage pMessage = NULL , pEntry ;
587+ BerElement * pBer = NULL ;
588+ PBERVAL * pBerVal ;
589+ PCHAR aBuffer ;
590+
591+ kull_m_string_args_byName (argc , argv , L"server" , & server , NULL );
592+
593+ kprintf (L"RPC mode: " );
594+ ret = DsEnumerateDomainTrusts (server , DS_DOMAIN_VALID_FLAGS , & pTrusts , & uTrusts );
584595 if (ret == ERROR_SUCCESS )
585596 {
586597 for (i = 0 ; i < uTrusts ; i ++ )
@@ -617,7 +628,7 @@ NTSTATUS kuhl_m_net_trust(int argc, wchar_t * argv[])
617628 kprintf (L" Attributes: 0x%08x ( " , pTrusts [i ].TrustAttributes );
618629 for (j = 0 ; j < (8 * sizeof (DWORD )); j ++ )
619630 if ((pTrusts [i ].TrustAttributes >> j ) & 1 )
620- kprintf (L"%s ; " , (j < ARRAYSIZE (TRUST_ATTRIBUTES )) ? TRUST_ATTRIBUTES [j ] : L"?" );
631+ kprintf (L"%s ; " , (j < ARRAYSIZE (TRUST_ATTRIBUTES )) ? TRUST_ATTRIBUTES [j ] : L"?" );
621632 kprintf (L")\n SID : " );
622633 kull_m_string_displaySID (pTrusts [i ].DomainSid );
623634 kprintf (L"\n GUID : " );
@@ -627,6 +638,96 @@ NTSTATUS kuhl_m_net_trust(int argc, wchar_t * argv[])
627638 NetApiBufferFree (pTrusts );
628639 }
629640 else PRINT_ERROR (L"DsEnumerateDomainTrusts: %u\n" , ret );
641+
642+ kprintf (L"\n\nLDAP mode: " );
643+ if (kull_m_ldap_getLdapAndRootDN (server , L"defaultNamingContext" , & ld , & dn ))
644+ {
645+ if (kull_m_string_sprintf (& sysDN , L"CN=System,%s" , dn ))
646+ {
647+ ret = ldap_search_s (ld , sysDN , LDAP_SCOPE_ONELEVEL , L"(objectClass=trustedDomain)" , myAttrs , FALSE, & pMessage );
648+ if (ret == LDAP_SUCCESS )
649+ {
650+ kprintf (L"%u entries\n" , ldap_count_entries (ld , pMessage ));
651+ for (pEntry = ldap_first_entry (ld , pMessage ); pEntry ; pEntry = ldap_next_entry (ld , pEntry ))
652+ {
653+ kprintf (L"\n%s\n" , ldap_get_dn (ld , pEntry ));
654+ for (pAttribute = ldap_first_attribute (ld , pEntry , & pBer ); pAttribute ; pAttribute = ldap_next_attribute (ld , pEntry , pBer ))
655+ {
656+ kprintf (L" %s: " , pAttribute );
657+ if (pBerVal = ldap_get_values_len (ld , pEntry , pAttribute ))
658+ {
659+ if ((_wcsicmp (pAttribute , L"objectGUID" ) == 0 ))
660+ {
661+ kull_m_string_displayGUID ((LPGUID ) pBerVal [0 ]-> bv_val );
662+ kprintf (L"\n" );
663+ }
664+ else if (
665+ (_wcsicmp (pAttribute , L"trustPartner" ) == 0 ) ||
666+ (_wcsicmp (pAttribute , L"flatName" ) == 0 )
667+ )
668+ {
669+ kprintf (L"%*S\n" , pBerVal [0 ]-> bv_len , pBerVal [0 ]-> bv_val );
670+ }
671+ else
672+ {
673+ if (kull_m_string_copyA_len (& aBuffer , pBerVal [0 ]-> bv_val , pBerVal [0 ]-> bv_len ))
674+ {
675+ ret = strtoul (aBuffer , NULL , 10 );
676+ kprintf (L"0x%08x - " , ret );
677+
678+
679+ if (_wcsicmp (pAttribute , L"trustAttributes" ) == 0 )
680+ {
681+ for (j = 0 ; j < (8 * sizeof (DWORD )); j ++ )
682+ if ((ret >> j ) & 1 )
683+ kprintf (L"%s ; " , (j < ARRAYSIZE (TRUST_ATTRIBUTES )) ? TRUST_ATTRIBUTES [j ] : L"?" );
684+ kprintf (L"\n" );
685+ }
686+ else if (_wcsicmp (pAttribute , L"trustType" ) == 0 )
687+ {
688+ switch (ret )
689+ {
690+ case TRUST_TYPE_DOWNLEVEL :
691+ kprintf (L"DOWNLEVEL (DC < 2000)\n" );
692+ break ;
693+ case TRUST_TYPE_UPLEVEL :
694+ kprintf (L"UPLEVEL (DC >= 2000)\n" );
695+ break ;
696+ case TRUST_TYPE_MIT :
697+ kprintf (L"MIT Kerberos realm\n" );
698+ break ;
699+ case 0x00000004 /*TRUST_TYPE_DCE*/ :
700+ kprintf (L"DCE realm\n" );
701+ break ;
702+ default :
703+ if ((pTrusts [i ].TrustType >= 0x5 ) && (pTrusts [i ].TrustType <= 0x000fffff ))
704+ kprintf (L"reserved for future use\n" );
705+ else if ((pTrusts [i ].TrustType >= 0x00100000 ) && (pTrusts [i ].TrustType <= 0xfff00000 ))
706+ kprintf (L"provider specific trust level\n" );
707+ else kprintf (L"?\n" );
708+ }
709+ }
710+ else if (_wcsicmp (pAttribute , L"trustDirection" ) == 0 )
711+ kprintf (L"%s\n" , TRUST_DIRECTION [ret & 0x00000003 ]);
712+ LocalFree (aBuffer );
713+ }
714+ }
715+ ldap_value_free_len (pBerVal );
716+ }
717+ ldap_memfree (pAttribute );
718+ }
719+ if (pBer )
720+ ber_free (pBer , 0 );
721+ }
722+ }
723+ else PRINT_ERROR (L"ldap_search_s 0x%x (%u)\n" , ret , ret );
724+ if (pMessage )
725+ ldap_msgfree (pMessage );
726+ LocalFree (sysDN );
727+ }
728+ LocalFree (dn );
729+ ldap_unbind (ld );
730+ }
630731 return STATUS_SUCCESS ;
631732}
632733
@@ -652,7 +753,7 @@ L")";
652753 BOOL isCheckDNS = kull_m_string_args_byName (argc , argv , L"dns" , NULL , NULL );
653754 kull_m_string_args_byName (argc , argv , L"server" , & server , NULL );
654755
655- if (kull_m_ldap_getLdapAndRootDN (server , & ld , & dn ))
756+ if (kull_m_ldap_getLdapAndRootDN (server , NULL , & ld , & dn ))
656757 {
657758 dwRet = ldap_search_s (ld , dn , LDAP_SCOPE_SUBTREE , filter , myAttrs , FALSE, & pMessage );
658759 if (dwRet == LDAP_SUCCESS )
0 commit comments