mirror of
https://github.com/samba-team/samba.git
synced 2025-01-14 19:24:43 +03:00
netapi: implement NetGroupDel_r().
Guenther
This commit is contained in:
parent
3f0ce34c62
commit
bcf3df6ca9
@ -275,15 +275,222 @@ WERROR NetGroupAdd_l(struct libnetapi_ctx *ctx,
|
||||
return WERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
****************************************************************/
|
||||
|
||||
WERROR NetGroupDel_r(struct libnetapi_ctx *ctx,
|
||||
struct NetGroupDel *r)
|
||||
{
|
||||
return WERR_NOT_SUPPORTED;
|
||||
struct cli_state *cli = NULL;
|
||||
struct rpc_pipe_client *pipe_cli = NULL;
|
||||
NTSTATUS status;
|
||||
WERROR werr;
|
||||
uint32_t resume_handle = 0;
|
||||
uint32_t num_entries = 0;
|
||||
POLICY_HND connect_handle, domain_handle, group_handle;
|
||||
struct samr_SamArray *sam = NULL;
|
||||
const char *domain_name = NULL;
|
||||
struct lsa_String lsa_domain_name, lsa_group_name;
|
||||
struct dom_sid2 *domain_sid = NULL;
|
||||
bool domain_found = true;
|
||||
int i;
|
||||
|
||||
struct samr_Ids rids;
|
||||
struct samr_Ids types;
|
||||
union samr_GroupInfo *info = NULL;
|
||||
struct samr_RidTypeArray *rid_array = NULL;
|
||||
|
||||
ZERO_STRUCT(connect_handle);
|
||||
ZERO_STRUCT(domain_handle);
|
||||
ZERO_STRUCT(group_handle);
|
||||
|
||||
if (!r->in.group_name) {
|
||||
return WERR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
werr = libnetapi_open_ipc_connection(ctx, r->in.server_name, &cli);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
werr = libnetapi_open_pipe(ctx, cli, PI_SAMR, &pipe_cli);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = rpccli_try_samr_connects(pipe_cli, ctx,
|
||||
SAMR_ACCESS_ENUM_DOMAINS |
|
||||
SAMR_ACCESS_OPEN_DOMAIN,
|
||||
&connect_handle);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = rpccli_samr_EnumDomains(pipe_cli, ctx,
|
||||
&connect_handle,
|
||||
&resume_handle,
|
||||
&sam,
|
||||
0xffffffff,
|
||||
&num_entries);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
for (i=0; i<num_entries; i++) {
|
||||
|
||||
domain_name = sam->entries[i].name.string;
|
||||
|
||||
if (strequal(domain_name, builtin_domain_name())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
domain_found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!domain_found) {
|
||||
werr = WERR_NO_SUCH_DOMAIN;
|
||||
goto done;
|
||||
}
|
||||
|
||||
init_lsa_String(&lsa_domain_name, domain_name);
|
||||
|
||||
status = rpccli_samr_LookupDomain(pipe_cli, ctx,
|
||||
&connect_handle,
|
||||
&lsa_domain_name,
|
||||
&domain_sid);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = rpccli_samr_OpenDomain(pipe_cli, ctx,
|
||||
&connect_handle,
|
||||
SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT,
|
||||
domain_sid,
|
||||
&domain_handle);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
init_lsa_String(&lsa_group_name, r->in.group_name);
|
||||
|
||||
status = rpccli_samr_LookupNames(pipe_cli, ctx,
|
||||
&domain_handle,
|
||||
1,
|
||||
&lsa_group_name,
|
||||
&rids,
|
||||
&types);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (types.ids[0] != SID_NAME_DOM_GRP) {
|
||||
werr = WERR_INVALID_DATATYPE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = rpccli_samr_OpenGroup(pipe_cli, ctx,
|
||||
&domain_handle,
|
||||
SEC_STD_DELETE |
|
||||
SAMR_GROUP_ACCESS_GET_MEMBERS |
|
||||
SAMR_GROUP_ACCESS_REMOVE_MEMBER |
|
||||
SAMR_GROUP_ACCESS_ADD_MEMBER |
|
||||
SAMR_GROUP_ACCESS_LOOKUP_INFO,
|
||||
rids.ids[0],
|
||||
&group_handle);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = rpccli_samr_QueryGroupInfo(pipe_cli, ctx,
|
||||
&group_handle,
|
||||
GROUPINFOATTRIBUTES,
|
||||
&info);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!(info->attributes.attributes & SE_GROUP_ENABLED)) {
|
||||
werr = WERR_ACCESS_DENIED;
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = rpccli_samr_QueryGroupMember(pipe_cli, ctx,
|
||||
&group_handle,
|
||||
&rid_array);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
{
|
||||
struct lsa_Strings names;
|
||||
struct samr_Ids member_types;
|
||||
|
||||
status = rpccli_samr_LookupRids(pipe_cli, ctx,
|
||||
&domain_handle,
|
||||
rid_array->count,
|
||||
rid_array->rids,
|
||||
&names,
|
||||
&member_types);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i < rid_array->count; i++) {
|
||||
|
||||
status = rpccli_samr_DeleteGroupMember(pipe_cli, ctx,
|
||||
&group_handle,
|
||||
rid_array->rids[i]);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
status = rpccli_samr_DeleteDomainGroup(pipe_cli, ctx,
|
||||
&group_handle);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
werr = ntstatus_to_werror(status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
ZERO_STRUCT(group_handle);
|
||||
|
||||
werr = WERR_OK;
|
||||
|
||||
done:
|
||||
if (!cli) {
|
||||
return werr;
|
||||
}
|
||||
|
||||
if (is_valid_policy_hnd(&group_handle)) {
|
||||
rpccli_samr_Close(pipe_cli, ctx, &group_handle);
|
||||
}
|
||||
if (is_valid_policy_hnd(&domain_handle)) {
|
||||
rpccli_samr_Close(pipe_cli, ctx, &domain_handle);
|
||||
}
|
||||
if (is_valid_policy_hnd(&connect_handle)) {
|
||||
rpccli_samr_Close(pipe_cli, ctx, &connect_handle);
|
||||
}
|
||||
|
||||
return werr;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
****************************************************************/
|
||||
|
||||
WERROR NetGroupDel_l(struct libnetapi_ctx *ctx,
|
||||
struct NetGroupDel *r)
|
||||
{
|
||||
return WERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user