diff options
Diffstat (limited to 'examples/libmsrpc/test/lsa/lsatrust.c')
-rw-r--r-- | examples/libmsrpc/test/lsa/lsatrust.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/examples/libmsrpc/test/lsa/lsatrust.c b/examples/libmsrpc/test/lsa/lsatrust.c new file mode 100644 index 0000000000..6ad293f832 --- /dev/null +++ b/examples/libmsrpc/test/lsa/lsatrust.c @@ -0,0 +1,151 @@ +/*queries trusted domain information*/ + +#include "libmsrpc.h" +#include "includes.h" + +#define MAX_STRING_LEN 50; + +void print_info(LSA_TRUSTED_DOMAIN_INFO *info) { + switch(info->info_class) { + case CAC_INFO_TRUSTED_DOMAIN_FULL_INFO: + case CAC_INFO_TRUSTED_DOMAIN_INFO_ALL: + printf(" Domain Name: %s\n", unistr2_static(&info->info_ex.domain_name.unistring)); + printf(" Netbios Name: %s\n", unistr2_static(&info->info_ex.netbios_name.unistring)); + printf(" Domain Sid: %s\n", sid_string_static(&info->info_ex.sid.sid)); + printf(" Trust direction: %d\n", info->info_ex.trust_direction); + printf(" Trust Type: %d\n", info->info_ex.trust_type); + printf(" Trust attr: %d\n", info->info_ex.trust_attributes); + printf(" Posix Offset: %d\n", info->posix_offset.posix_offset); + break; + } +} + +int main() { + CacServerHandle *hnd = NULL; + TALLOC_CTX *mem_ctx = NULL; + POLICY_HND *lsa_pol = NULL; + + int i; + + mem_ctx = talloc_init("lsatrust"); + + hnd = cac_NewServerHandle(False); + + /*malloc some memory so get_auth_data_fn can work*/ + hnd->username = SMB_MALLOC_ARRAY(char, sizeof(fstring)); + hnd->domain = SMB_MALLOC_ARRAY(char, sizeof(fstring)); + hnd->netbios_name = SMB_MALLOC_ARRAY(char, sizeof(fstring)); + hnd->password = SMB_MALLOC_ARRAY(char, sizeof(fstring)); + + hnd->server = SMB_MALLOC_ARRAY(char, sizeof(fstring)); + + + printf("Server: "); + fscanf(stdin, "%s", hnd->server); + + printf("Connecting to server....\n"); + + if(!cac_Connect(hnd, NULL)) { + fprintf(stderr, "Could not connect to server.\n Error: %s\n errno %s\n", nt_errstr(hnd->status), strerror(errno)); + cac_FreeHandle(hnd); + exit(-1); + } + + printf("Connected to server\n"); + + struct LsaOpenPolicy lop; + ZERO_STRUCT(lop); + + lop.in.access = SEC_RIGHT_MAXIMUM_ALLOWED; + lop.in.security_qos = True; + + + if(!cac_LsaOpenPolicy(hnd, mem_ctx, &lop)) { + fprintf(stderr, "Could not open policy handle.\n Error: %s\n", nt_errstr(hnd->status)); + cac_FreeHandle(hnd); + exit(-1); + } + + lsa_pol = lop.out.pol; + + printf("Enumerating Trusted Domains\n"); + + struct LsaEnumTrustedDomains etd; + ZERO_STRUCT(etd); + + etd.in.pol = lsa_pol; + + while(cac_LsaEnumTrustedDomains(hnd, mem_ctx, &etd)) { + printf(" Enumerated %d domains\n", etd.out.num_domains); + + for(i = 0; i < etd.out.num_domains; i++) { + printf(" Name: %s\n", etd.out.domain_names[i]); + printf(" SID: %s\n", sid_string_static(&etd.out.domain_sids[i])); + + printf("\n Attempting to open domain...\n"); + + struct LsaOpenTrustedDomain otd; + ZERO_STRUCT(otd); + + otd.in.pol = lsa_pol; + otd.in.domain_sid = &etd.out.domain_sids[i]; + otd.in.access = SEC_RIGHT_MAXIMUM_ALLOWED; + + /*try to query trusted domain info by name*/ + struct LsaQueryTrustedDomainInfo qtd; + ZERO_STRUCT(qtd); + + qtd.in.pol = lsa_pol; + qtd.in.domain_name = etd.out.domain_names[i]; + + + int j; + for(j = 0; j < 100; j++ ) { + qtd.in.info_class = j; + + printf(" Querying trustdom by name\n"); + if(!cac_LsaQueryTrustedDomainInfo(hnd, mem_ctx, &qtd)) { + fprintf(stderr, " could not query trusted domain info.\n Error %s\n", nt_errstr(hnd->status)); + continue; + } + + printf(" info_class %d succeeded\n", j); + printf(" Query result:\n"); + printf(" size %d\n", sizeof(*qtd.out.info)); + } + + /*try to query trusted domain info by SID*/ + printf(" Querying trustdom by sid\n"); + qtd.in.domain_sid = &etd.out.domain_sids[i]; + if(!cac_LsaQueryTrustedDomainInfo(hnd, mem_ctx, &qtd)) { + fprintf(stderr, " could not query trusted domain info.\n Error %s\n", nt_errstr(hnd->status)); + continue; + } + + printf(" Query result:\n"); +/* print_info(qtd.out.info);*/ + + if(CAC_OP_FAILED(hnd->status)) { + fprintf(stderr, " Could not enum sids.\n Error: %s\n", nt_errstr(hnd->status)); + continue; + } + } + + printf("\n"); + } + + if(CAC_OP_FAILED(hnd->status)) { + fprintf(stderr, "Error while enumerating trusted domains.\n Error: %s\n", nt_errstr(hnd->status)); + goto done; + } + +done: + if(!cac_LsaClosePolicy(hnd, mem_ctx, lsa_pol)) { + fprintf(stderr, "Could not close policy handle.\n Error: %s\n", nt_errstr(hnd->status)); + } + + cac_FreeHandle(hnd); + talloc_destroy(mem_ctx); + + return 0; +} |