static NTSTATUS cmd_lsa_enum_privilege(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { struct policy_handle pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; struct lsa_PrivArray priv_array; uint32 enum_context=0; uint32 pref_max_length=0x1000; int i; if (argc > 3) { printf("Usage: %s [enum context] [max length]\n", argv[0]); return NT_STATUS_OK; } if (argc>=2) enum_context=atoi(argv[1]); if (argc==3) pref_max_length=atoi(argv[2]); result = rpccli_lsa_open_policy(cli, mem_ctx, True, SEC_FLAG_MAXIMUM_ALLOWED, &pol); if (!NT_STATUS_IS_OK(result)) goto done; result = rpccli_lsa_EnumPrivs(cli, mem_ctx, &pol, &enum_context, &priv_array, pref_max_length); if (!NT_STATUS_IS_OK(result)) goto done; /* Print results */ printf("found %d privileges\n\n", priv_array.count); for (i = 0; i < priv_array.count; i++) { printf("%s \t\t%d:%d (0x%x:0x%x)\n", priv_array.privs[i].name.string ? priv_array.privs[i].name.string : "*unknown*", priv_array.privs[i].luid.high, priv_array.privs[i].luid.low, priv_array.privs[i].luid.high, priv_array.privs[i].luid.low); } rpccli_lsa_Close(cli, mem_ctx, &pol); done: return result; }
static NTSTATUS enum_privileges(struct rpc_pipe_client *pipe_hnd, TALLOC_CTX *ctx, struct policy_handle *pol ) { NTSTATUS result; uint32 enum_context = 0; uint32 pref_max_length=0x1000; int i; uint16 lang_id=0; uint16 lang_id_sys=0; uint16 lang_id_desc; struct lsa_StringLarge *description = NULL; struct lsa_PrivArray priv_array; result = rpccli_lsa_EnumPrivs(pipe_hnd, ctx, pol, &enum_context, &priv_array, pref_max_length); if ( !NT_STATUS_IS_OK(result) ) return result; /* Print results */ for (i = 0; i < priv_array.count; i++) { struct lsa_String lsa_name; d_printf("%30s ", priv_array.privs[i].name.string ? priv_array.privs[i].name.string : "*unknown*" ); /* try to get the description */ init_lsa_String(&lsa_name, priv_array.privs[i].name.string); result = rpccli_lsa_LookupPrivDisplayName(pipe_hnd, ctx, pol, &lsa_name, lang_id, lang_id_sys, &description, &lang_id_desc); if (!NT_STATUS_IS_OK(result)) { d_printf("??????\n"); continue; } d_printf("%s\n", description->string); } return NT_STATUS_OK; }