/* get a list of trusted domains */ static NTSTATUS trusted_domains(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, uint32 *num_domains, char ***names, char ***alt_names, DOM_SID **dom_sids) { CLI_POLICY_HND *hnd; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; uint32 enum_ctx = 0; int retry; DEBUG(3,("rpc: trusted_domains\n")); *num_domains = 0; *alt_names = NULL; retry = 0; do { if (!NT_STATUS_IS_OK(result = cm_get_lsa_handle(find_our_domain(), &hnd))) goto done; result = cli_lsa_enum_trust_dom(hnd->cli, mem_ctx, &hnd->pol, &enum_ctx, num_domains, names, dom_sids); } while (!NT_STATUS_IS_OK(result) && (retry++ < 1) && hnd && hnd->cli && hnd->cli->fd == -1); done: return result; }
static NTSTATUS cmd_lsa_enum_trust_dom(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; DOM_SID *domain_sids; char **domain_names; /* defaults, but may be changed using params */ uint32 enum_ctx = 0; uint32 num_domains = 0; int i; if (argc > 2) { printf("Usage: %s [enum context (0)]\n", argv[0]); return NT_STATUS_OK; } if (argc == 2 && argv[1]) { enum_ctx = atoi(argv[2]); } result = cli_lsa_open_policy(cli, mem_ctx, True, POLICY_VIEW_LOCAL_INFORMATION, &pol); if (!NT_STATUS_IS_OK(result)) goto done; result = STATUS_MORE_ENTRIES; while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) { /* Lookup list of trusted domains */ result = cli_lsa_enum_trust_dom(cli, mem_ctx, &pol, &enum_ctx, &num_domains, &domain_names, &domain_sids); if (!NT_STATUS_IS_OK(result) && !NT_STATUS_EQUAL(result, NT_STATUS_NO_MORE_ENTRIES) && !NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) goto done; /* Print results: list of names and sids returned in this * response. */ for (i = 0; i < num_domains; i++) { fstring sid_str; sid_to_string(sid_str, &domain_sids[i]); printf("%s %s\n", domain_names[i] ? domain_names[i] : "*unknown*", sid_str); } } done: return result; }
static NTSTATUS cmd_lsa_enum_trust_dom(struct cli_state *cli, TALLOC_CTX *mem_ctx, int argc, char **argv) { POLICY_HND pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; DOM_SID *domain_sids; char **domain_names; uint32 enum_ctx = 0; uint32 num_domains; int i; if (argc != 1) { printf("Usage: %s\n", argv[0]); return NT_STATUS_OK; } result = cli_lsa_open_policy(cli, mem_ctx, True, SEC_RIGHTS_MAXIMUM_ALLOWED, &pol); if (!NT_STATUS_IS_OK(result)) goto done; /* Lookup list of trusted domains */ result = cli_lsa_enum_trust_dom(cli, mem_ctx, &pol, &enum_ctx, &num_domains, &domain_names, &domain_sids); if (!NT_STATUS_IS_OK(result)) goto done; /* Print results */ for (i = 0; i < num_domains; i++) { fstring sid_str; sid_to_string(sid_str, &domain_sids[i]); printf("%s %s\n", domain_names[i] ? domain_names[i] : "*unknown*", sid_str); } done: return result; }