[PATCH] group control bits ....

Stefan (metze) Metzmacher metze at metzemix.de
Fri Sep 6 07:46:01 GMT 2002


>
> >
> > -NTSTATUS sam_skel_get_groups_of_account(const struct sam_methods
>*sam_method, const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32
>*group_count, SAM_GROUP_ENUM **groups)
> > +NTSTATUS sam_skel_get_groups_of_sid(const struct sam_methods *sam_method,
>const NT_USER_TOKEN *access_token, const DOM_SID **sids, const uint32 type,
>uint32 *group_count, SAM_GROUP_ENUM **groups)
>
>you forgott to change the const uint32 type to uint16 group_ctrl

I fixed that :-)

I also change 'struct sam_methods' -> 'SAM_METHODS'  in sam_skel.c

I also change the prototypes of sam_create_account ,sam_create_group

and set SAM_INTERFACE_VERSION 0  until we have a stable interface:-)




metze
-----------------------------------------------------------------------------
Stefan "metze" Metzmacher <metze at metzemix.de>
-------------- next part --------------
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=.#* HEAD/source/sam/api.c HEAD-fix/source/sam/api.c
--- HEAD/source/sam/api.c	Thu Aug 29 09:19:05 2002
+++ HEAD-fix/source/sam/api.c	Fri Sep  6 08:10:46 2002
@@ -1,7 +1,7 @@
 /* 
    Unix SMB/CIFS implementation.
    SAM interface API.
-
	
+	
    Copyright (C) Stefan (metze) Metzmacher		2002
       
    This program is free software; you can redistribute it and/or modify
@@ -120,7 +120,7 @@ NTSTATUS sam_get_domain_by_sid(const NT_
 
 /* Account API */
 
-NTSTATUS sam_create_account(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_ACCOUNT_HANDLE **account)
+NTSTATUS sam_create_account(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, const char *account_name, uint16 acct_ctrl, SAM_ACCOUNT_HANDLE **account)
 {
 	SAM_CONTEXT *sam_context = sam_get_static_context(False);
 
@@ -128,7 +128,7 @@ NTSTATUS sam_create_account(const NT_USE
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
-	return sam_context->sam_create_account(sam_context, access_token, access_desired, domainsid, account);
+	return sam_context->sam_create_account(sam_context, access_token, access_desired, domainsid, account_name, acct_ctrl, account);
 }
 
 NTSTATUS sam_add_account(const DOM_SID *domainsid, const SAM_ACCOUNT_HANDLE *account)
@@ -164,7 +164,7 @@ NTSTATUS sam_delete_account(const SAM_AC
 	return sam_context->sam_delete_account(sam_context, account);
 }
 
-NTSTATUS sam_enum_accounts(const NT_USER_TOKEN *access_token, const DOM_SID *domain, int32 *account_count, SAM_ACCOUNT_ENUM **accounts)
+NTSTATUS sam_enum_accounts(const NT_USER_TOKEN *access_token, const DOM_SID *domain, uint16 acct_ctrl, uint32 *account_count, SAM_ACCOUNT_ENUM **accounts)
 {
 	SAM_CONTEXT *sam_context = sam_get_static_context(False);
 
@@ -172,7 +172,7 @@ NTSTATUS sam_enum_accounts(const NT_USER
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
-	return sam_context->sam_enum_accounts(sam_context, access_token, domain, account_count, accounts);
+	return sam_context->sam_enum_accounts(sam_context, access_token, domain, acct_ctrl, account_count, accounts);
 }
 
 NTSTATUS sam_get_account_by_sid(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account)
@@ -199,6 +199,17 @@ NTSTATUS sam_get_account_by_name(const N
 
 /* Group API */
 
+NTSTATUS sam_create_group(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, const char *group_name, uint16 group_ctrl, SAM_GROUP_HANDLE **group)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_create_group(sam_context, access_token, access_desired, domainsid, group_name, group_ctrl, group);
+}
+
 NTSTATUS sam_add_group(const DOM_SID *domainsid, const SAM_GROUP_HANDLE *group)
 {
 	SAM_CONTEXT *sam_context = sam_get_static_context(False);
@@ -232,7 +243,7 @@ NTSTATUS sam_delete_group(const SAM_GROU
 	return sam_context->sam_delete_group(sam_context, group);
 }
 
-NTSTATUS sam_enum_groups(const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups)
+NTSTATUS sam_enum_groups(const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, uint16 group_ctrl, uint32 *groups_count, SAM_GROUP_ENUM **groups)
 {
 	SAM_CONTEXT *sam_context = sam_get_static_context(False);
 
@@ -240,7 +251,7 @@ NTSTATUS sam_enum_groups(const NT_USER_T
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
-	return sam_context->sam_enum_groups(sam_context, access_token, domainsid, type, groups_count, groups);
+	return sam_context->sam_enum_groups(sam_context, access_token, domainsid, group_ctrl, groups_count, groups);
 }
 
 NTSTATUS sam_get_group_by_sid(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group)
@@ -298,7 +309,7 @@ NTSTATUS sam_enum_groupmembers(const SAM
 	return sam_context->sam_enum_groupmembers(sam_context, group, members_count, members);
 }
 
-NTSTATUS sam_get_groups_of_account(const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups)
+NTSTATUS sam_get_groups_of_sid(const NT_USER_TOKEN *access_token, const DOM_SID **sids, uint16 group_ctrl, uint32 *group_count, SAM_GROUP_ENUM **groups)
 {
 	SAM_CONTEXT *sam_context = sam_get_static_context(False);
 
@@ -306,6 +317,6 @@ NTSTATUS sam_get_groups_of_account(const
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
-	return sam_context->sam_get_groups_of_account(sam_context, account, type, group_count, groups);
+	return sam_context->sam_get_groups_of_sid(sam_context, access_token, sids, group_ctrl, group_count, groups);
 }
 
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=.#* HEAD/source/sam/get_set_account.c HEAD-fix/source/sam/get_set_account.c
--- HEAD/source/sam/get_set_account.c	Thu Aug 29 09:19:05 2002
+++ HEAD-fix/source/sam/get_set_account.c	Thu Sep  5 03:27:40 2002
@@ -355,7 +355,7 @@ NTSTATUS sam_get_account_unknown_3(const
  Collection of set...() functions for SAM_ACCOUNT_HANDLE_INFO.
  ********************************************************************/
 
-NTSTATUS sam_set_account_acct_ctrl(SAM_ACCOUNT_HANDLE *sampass, uint16 flags)
+NTSTATUS sam_set_account_acct_ctrl(SAM_ACCOUNT_HANDLE *sampass, const uint16 flags)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -365,7 +365,7 @@ NTSTATUS sam_set_account_acct_ctrl(SAM_A
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_logon_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+NTSTATUS sam_set_account_logon_time(SAM_ACCOUNT_HANDLE *sampass, const NTTIME mytime, const BOOL store)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -378,7 +378,7 @@ NTSTATUS sam_set_account_logon_time(SAM_
 	return NT_STATUS_UNSUCCESSFUL;
 }
 
-NTSTATUS sam_set_account_logoff_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+NTSTATUS sam_set_account_logoff_time(SAM_ACCOUNT_HANDLE *sampass, const NTTIME mytime, const BOOL store)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -391,7 +391,7 @@ NTSTATUS sam_set_account_logoff_time(SAM
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_kickoff_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+NTSTATUS sam_set_account_kickoff_time(SAM_ACCOUNT_HANDLE *sampass, const NTTIME mytime, const BOOL store)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -404,7 +404,7 @@ NTSTATUS sam_set_account_kickoff_time(SA
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_pass_can_change_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+NTSTATUS sam_set_account_pass_can_change_time(SAM_ACCOUNT_HANDLE *sampass, const NTTIME mytime, const BOOL store)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -417,7 +417,7 @@ NTSTATUS sam_set_account_pass_can_change
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_pass_must_change_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+NTSTATUS sam_set_account_pass_must_change_time(SAM_ACCOUNT_HANDLE *sampass, const NTTIME mytime, const BOOL store)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -430,7 +430,7 @@ NTSTATUS sam_set_account_pass_must_chang
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_pass_last_set_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime)
+NTSTATUS sam_set_account_pass_last_set_time(SAM_ACCOUNT_HANDLE *sampass, const NTTIME mytime)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -440,7 +440,7 @@ NTSTATUS sam_set_account_pass_last_set_t
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_hours_len(SAM_ACCOUNT_HANDLE *sampass, uint32 len)
+NTSTATUS sam_set_account_hours_len(SAM_ACCOUNT_HANDLE *sampass, const uint32 len)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -449,7 +449,7 @@ NTSTATUS sam_set_account_hours_len(SAM_A
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_logon_divs(SAM_ACCOUNT_HANDLE *sampass, uint16 hours)
+NTSTATUS sam_set_account_logon_divs(SAM_ACCOUNT_HANDLE *sampass, const uint16 hours)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -465,7 +465,7 @@ NTSTATUS sam_set_account_logon_divs(SAM_
  *             this flag is only added.  
  **/
  
-NTSTATUS sam_set_account_init_flag(SAM_ACCOUNT_HANDLE *sampass, uint32 flag)
+NTSTATUS sam_set_account_init_flag(SAM_ACCOUNT_HANDLE *sampass, const uint32 flag)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -475,7 +475,7 @@ NTSTATUS sam_set_account_init_flag(SAM_A
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_sid(SAM_ACCOUNT_HANDLE *sampass, DOM_SID *u_sid)
+NTSTATUS sam_set_account_sid(SAM_ACCOUNT_HANDLE *sampass, const DOM_SID *u_sid)
 {
 	if (!sampass || !u_sid)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -488,7 +488,7 @@ NTSTATUS sam_set_account_sid(SAM_ACCOUNT
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_sid_from_string(SAM_ACCOUNT_HANDLE *sampass, fstring u_sid)
+NTSTATUS sam_set_account_sid_from_string(SAM_ACCOUNT_HANDLE *sampass, const fstring u_sid)
 {
 	DOM_SID new_sid;
 	if (!sampass || !u_sid)
@@ -510,7 +510,7 @@ NTSTATUS sam_set_account_sid_from_string
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_pgroup_sid(SAM_ACCOUNT_HANDLE *sampass, DOM_SID *g_sid)
+NTSTATUS sam_set_account_pgroup_sid(SAM_ACCOUNT_HANDLE *sampass, const DOM_SID *g_sid)
 {
 	if (!sampass || !g_sid)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -523,7 +523,7 @@ NTSTATUS sam_set_account_pgroup_sid(SAM_
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_pgroup_string(SAM_ACCOUNT_HANDLE *sampass, fstring g_sid)
+NTSTATUS sam_set_account_pgroup_string(SAM_ACCOUNT_HANDLE *sampass, const fstring g_sid)
 {
 	DOM_SID new_sid;
 	if (!sampass || !g_sid)
@@ -594,7 +594,7 @@ NTSTATUS sam_set_account_fullname(SAM_AC
  Set the account's logon script.
  ********************************************************************/
 
-NTSTATUS sam_set_account_logon_script(SAM_ACCOUNT_HANDLE *sampass, const char *logon_script, BOOL store)
+NTSTATUS sam_set_account_logon_script(SAM_ACCOUNT_HANDLE *sampass, const char *logon_script, const BOOL store)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -612,7 +612,7 @@ NTSTATUS sam_set_account_logon_script(SA
  Set the account's profile path.
  ********************************************************************/
 
-NTSTATUS sam_set_account_profile_path(SAM_ACCOUNT_HANDLE *sampass, const char *profile_path, BOOL store)
+NTSTATUS sam_set_account_profile_path(SAM_ACCOUNT_HANDLE *sampass, const char *profile_path, const BOOL store)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -633,7 +633,7 @@ NTSTATUS sam_set_account_profile_path(SA
  Set the account's directory drive.
  ********************************************************************/
 
-NTSTATUS sam_set_account_dir_drive(SAM_ACCOUNT_HANDLE *sampass, const char *dir_drive, BOOL store)
+NTSTATUS sam_set_account_dir_drive(SAM_ACCOUNT_HANDLE *sampass, const char *dir_drive, const BOOL store)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -655,7 +655,7 @@ NTSTATUS sam_set_account_dir_drive(SAM_A
  Set the account's home directory.
  ********************************************************************/
 
-NTSTATUS sam_set_account_homedir(SAM_ACCOUNT_HANDLE *sampass, const char *home_dir, BOOL store)
+NTSTATUS sam_set_account_homedir(SAM_ACCOUNT_HANDLE *sampass, const char *home_dir, const BOOL store)
 {
 	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
 
@@ -751,7 +751,7 @@ NTSTATUS sam_set_account_munged_dial(SAM
  Set the account's NT hash.
  ********************************************************************/
 
-NTSTATUS sam_set_account_nt_pwd(SAM_ACCOUNT_HANDLE *sampass, DATA_BLOB data)
+NTSTATUS sam_set_account_nt_pwd(SAM_ACCOUNT_HANDLE *sampass, const DATA_BLOB data)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -765,7 +765,7 @@ NTSTATUS sam_set_account_nt_pwd(SAM_ACCO
  Set the account's LM hash.
  ********************************************************************/
 
-NTSTATUS sam_set_account_lm_pwd(SAM_ACCOUNT_HANDLE *sampass, DATA_BLOB data)
+NTSTATUS sam_set_account_lm_pwd(SAM_ACCOUNT_HANDLE *sampass, const DATA_BLOB data)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -790,7 +790,7 @@ NTSTATUS sam_set_account_plaintext_pwd(S
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_unknown_1(SAM_ACCOUNT_HANDLE *sampass, uint32 unkn)
+NTSTATUS sam_set_account_unknown_1(SAM_ACCOUNT_HANDLE *sampass, const uint32 unkn)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -800,7 +800,7 @@ NTSTATUS sam_set_account_unknown_1(SAM_A
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_unknown_2(SAM_ACCOUNT_HANDLE *sampass, uint32 unkn)
+NTSTATUS sam_set_account_unknown_2(SAM_ACCOUNT_HANDLE *sampass, const uint32 unkn)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
@@ -810,7 +810,7 @@ NTSTATUS sam_set_account_unknown_2(SAM_A
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_account_unknown_3(SAM_ACCOUNT_HANDLE *sampass, uint32 unkn)
+NTSTATUS sam_set_account_unknown_3(SAM_ACCOUNT_HANDLE *sampass, const uint32 unkn)
 {
 	if (!sampass)
 		return NT_STATUS_UNSUCCESSFUL;
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=.#* HEAD/source/sam/get_set_domain.c HEAD-fix/source/sam/get_set_domain.c
--- HEAD/source/sam/get_set_domain.c	Thu Aug 29 16:26:44 2002
+++ HEAD-fix/source/sam/get_set_domain.c	Thu Sep  5 03:29:38 2002
@@ -25,7 +25,7 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_SAM
 
-NTSTATUS sam_get_domain_sid(SAM_DOMAIN_HANDLE *domain, DOM_SID **sid)
+NTSTATUS sam_get_domain_sid(const SAM_DOMAIN_HANDLE *domain, DOM_SID **sid)
 {
 	if (!domain || !sid) return NT_STATUS_UNSUCCESSFUL;
 
@@ -34,7 +34,7 @@ NTSTATUS sam_get_domain_sid(SAM_DOMAIN_H
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_num_accounts(SAM_DOMAIN_HANDLE *domain, uint32 *num_accounts)
+NTSTATUS sam_get_domain_num_accounts(const SAM_DOMAIN_HANDLE *domain, uint32 *num_accounts)
 {
 	if (!domain || !num_accounts) return NT_STATUS_UNSUCCESSFUL;
 
@@ -43,7 +43,7 @@ NTSTATUS sam_get_domain_num_accounts(SAM
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_num_groups(SAM_DOMAIN_HANDLE *domain, uint32 *num_groups)
+NTSTATUS sam_get_domain_num_groups(const SAM_DOMAIN_HANDLE *domain, uint32 *num_groups)
 {
 	if (!domain || !num_groups) return NT_STATUS_UNSUCCESSFUL;
 
@@ -52,7 +52,7 @@ NTSTATUS sam_get_domain_num_groups(SAM_D
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_num_aliases(SAM_DOMAIN_HANDLE *domain, uint32 *num_aliases)
+NTSTATUS sam_get_domain_num_aliases(const SAM_DOMAIN_HANDLE *domain, uint32 *num_aliases)
 {
 	if (!domain || !num_aliases) return NT_STATUS_UNSUCCESSFUL;
 
@@ -61,7 +61,7 @@ NTSTATUS sam_get_domain_num_aliases(SAM_
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_name(SAM_DOMAIN_HANDLE *domain, char **domain_name)
+NTSTATUS sam_get_domain_name(const SAM_DOMAIN_HANDLE *domain, char **domain_name)
 {
 	if (!domain || !domain_name) return NT_STATUS_UNSUCCESSFUL;
 
@@ -70,7 +70,7 @@ NTSTATUS sam_get_domain_name(SAM_DOMAIN_
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_server(SAM_DOMAIN_HANDLE *domain, char **server_name)
+NTSTATUS sam_get_domain_server(const SAM_DOMAIN_HANDLE *domain, char **server_name)
 {
 	if (!domain || !server_name) return NT_STATUS_UNSUCCESSFUL;
 
@@ -79,7 +79,7 @@ NTSTATUS sam_get_domain_server(SAM_DOMAI
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_max_pwdage(SAM_DOMAIN_HANDLE *domain, NTTIME *max_passwordage)
+NTSTATUS sam_get_domain_max_pwdage(const SAM_DOMAIN_HANDLE *domain, NTTIME *max_passwordage)
 {
 	if (!domain || !max_passwordage) return NT_STATUS_UNSUCCESSFUL;
 
@@ -88,7 +88,7 @@ NTSTATUS sam_get_domain_max_pwdage(SAM_D
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_min_pwdage(SAM_DOMAIN_HANDLE *domain, NTTIME *min_passwordage)
+NTSTATUS sam_get_domain_min_pwdage(const SAM_DOMAIN_HANDLE *domain, NTTIME *min_passwordage)
 {
 	if (!domain || !min_passwordage) return NT_STATUS_UNSUCCESSFUL;
 
@@ -97,7 +97,7 @@ NTSTATUS sam_get_domain_min_pwdage(SAM_D
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_lockout_duration(SAM_DOMAIN_HANDLE *domain, NTTIME *lockout_duration)
+NTSTATUS sam_get_domain_lockout_duration(const SAM_DOMAIN_HANDLE *domain, NTTIME *lockout_duration)
 {
 	if (!domain || !lockout_duration) return NT_STATUS_UNSUCCESSFUL;
 
@@ -106,7 +106,7 @@ NTSTATUS sam_get_domain_lockout_duration
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_reset_count(SAM_DOMAIN_HANDLE *domain, NTTIME *reset_lockout_count)
+NTSTATUS sam_get_domain_reset_count(const SAM_DOMAIN_HANDLE *domain, NTTIME *reset_lockout_count)
 {
 	if (!domain || !reset_lockout_count) return NT_STATUS_UNSUCCESSFUL;
 	
@@ -115,7 +115,7 @@ NTSTATUS sam_get_domain_reset_count(SAM_
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_min_pwdlength(SAM_DOMAIN_HANDLE *domain, uint16 *min_passwordlength)
+NTSTATUS sam_get_domain_min_pwdlength(const SAM_DOMAIN_HANDLE *domain, uint16 *min_passwordlength)
 {
 	if (!domain || !min_passwordlength) return NT_STATUS_UNSUCCESSFUL;
 
@@ -124,7 +124,7 @@ NTSTATUS sam_get_domain_min_pwdlength(SA
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_pwd_history(SAM_DOMAIN_HANDLE *domain, uint16 *password_history)
+NTSTATUS sam_get_domain_pwd_history(const SAM_DOMAIN_HANDLE *domain, uint16 *password_history)
 {
 	if (!domain || !password_history) return NT_STATUS_UNSUCCESSFUL;
 
@@ -133,7 +133,7 @@ NTSTATUS sam_get_domain_pwd_history(SAM_
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_lockout_count(SAM_DOMAIN_HANDLE *domain, uint16 *lockout_count)
+NTSTATUS sam_get_domain_lockout_count(const SAM_DOMAIN_HANDLE *domain, uint16 *lockout_count)
 {
 	if (!domain || !lockout_count) return NT_STATUS_UNSUCCESSFUL;
 
@@ -142,7 +142,7 @@ NTSTATUS sam_get_domain_lockout_count(SA
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_force_logoff(SAM_DOMAIN_HANDLE *domain, BOOL *force_logoff)
+NTSTATUS sam_get_domain_force_logoff(const SAM_DOMAIN_HANDLE *domain, BOOL *force_logoff)
 {
 	if (!domain || !force_logoff) return NT_STATUS_UNSUCCESSFUL;
 
@@ -152,7 +152,7 @@ NTSTATUS sam_get_domain_force_logoff(SAM
 }
 
 
-NTSTATUS sam_get_domain_login_pwdchange(SAM_DOMAIN_HANDLE *domain, BOOL *login_pwdchange)
+NTSTATUS sam_get_domain_login_pwdchange(const SAM_DOMAIN_HANDLE *domain, BOOL *login_pwdchange)
 {
 	if (!domain || !login_pwdchange) return NT_STATUS_UNSUCCESSFUL;
 
@@ -163,7 +163,7 @@ NTSTATUS sam_get_domain_login_pwdchange(
 
 /* Set */
 
-NTSTATUS sam_set_domain_name(SAM_DOMAIN_HANDLE *domain, char *domain_name)
+NTSTATUS sam_set_domain_name(SAM_DOMAIN_HANDLE *domain, const char *domain_name)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -173,7 +173,7 @@ NTSTATUS sam_set_domain_name(SAM_DOMAIN_
 }
 
 
-NTSTATUS sam_set_domain_max_pwdage(SAM_DOMAIN_HANDLE *domain, NTTIME max_passwordage)
+NTSTATUS sam_set_domain_max_pwdage(SAM_DOMAIN_HANDLE *domain, const NTTIME max_passwordage)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -182,7 +182,7 @@ NTSTATUS sam_set_domain_max_pwdage(SAM_D
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_min_pwdage(SAM_DOMAIN_HANDLE *domain, NTTIME min_passwordage)
+NTSTATUS sam_set_domain_min_pwdage(SAM_DOMAIN_HANDLE *domain, const NTTIME min_passwordage)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -191,7 +191,7 @@ NTSTATUS sam_set_domain_min_pwdage(SAM_D
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_lockout_duration(SAM_DOMAIN_HANDLE *domain, NTTIME lockout_duration)
+NTSTATUS sam_set_domain_lockout_duration(SAM_DOMAIN_HANDLE *domain, const NTTIME lockout_duration)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -199,7 +199,7 @@ NTSTATUS sam_set_domain_lockout_duration
 
 	return NT_STATUS_OK;
 }
-NTSTATUS sam_set_domain_reset_count(SAM_DOMAIN_HANDLE *domain, NTTIME reset_lockout_count)
+NTSTATUS sam_set_domain_reset_count(SAM_DOMAIN_HANDLE *domain, const NTTIME reset_lockout_count)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -208,7 +208,7 @@ NTSTATUS sam_set_domain_reset_count(SAM_
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_min_pwdlength(SAM_DOMAIN_HANDLE *domain, uint16 min_passwordlength)
+NTSTATUS sam_set_domain_min_pwdlength(SAM_DOMAIN_HANDLE *domain, const uint16 min_passwordlength)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -217,7 +217,7 @@ NTSTATUS sam_set_domain_min_pwdlength(SA
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_pwd_history(SAM_DOMAIN_HANDLE *domain, uint16 password_history)
+NTSTATUS sam_set_domain_pwd_history(SAM_DOMAIN_HANDLE *domain, const uint16 password_history)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -226,7 +226,7 @@ NTSTATUS sam_set_domain_pwd_history(SAM_
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_lockout_count(SAM_DOMAIN_HANDLE *domain, uint16 lockout_count)
+NTSTATUS sam_set_domain_lockout_count(SAM_DOMAIN_HANDLE *domain, const uint16 lockout_count)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -235,7 +235,7 @@ NTSTATUS sam_set_domain_lockout_count(SA
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_force_logoff(SAM_DOMAIN_HANDLE *domain, BOOL force_logoff)
+NTSTATUS sam_set_domain_force_logoff(SAM_DOMAIN_HANDLE *domain, const BOOL force_logoff)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -244,7 +244,7 @@ NTSTATUS sam_set_domain_force_logoff(SAM
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_login_pwdchange(SAM_DOMAIN_HANDLE *domain, BOOL login_pwdchange)
+NTSTATUS sam_set_domain_login_pwdchange(SAM_DOMAIN_HANDLE *domain, const BOOL login_pwdchange)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
@@ -253,7 +253,7 @@ NTSTATUS sam_set_domain_login_pwdchange(
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_server(SAM_DOMAIN_HANDLE *domain, char *server_name)
+NTSTATUS sam_set_domain_server(SAM_DOMAIN_HANDLE *domain, const char *server_name)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=.#* HEAD/source/sam/get_set_group.c HEAD-fix/source/sam/get_set_group.c
--- HEAD/source/sam/get_set_group.c	Thu Aug 29 14:24:29 2002
+++ HEAD-fix/source/sam/get_set_group.c	Thu Sep  5 04:27:56 2002
@@ -36,11 +36,11 @@ NTSTATUS sam_get_group_sid(const SAM_GRO
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_group_typ(const SAM_GROUP_HANDLE *group, uint32 *typ)
+NTSTATUS sam_get_group_ctrl(const SAM_GROUP_HANDLE *group, uint32 *group_ctrl)
 {
-	if (!group || !typ) return NT_STATUS_UNSUCCESSFUL;
+	if (!group || !group_ctrl) return NT_STATUS_UNSUCCESSFUL;
 
-	*typ = group->private.flags;
+	*group_ctrl = group->private.group_ctrl;
 
 	return NT_STATUS_OK;
 }
@@ -49,32 +49,23 @@ NTSTATUS sam_get_group_name(const SAM_GR
 {
 	if (!group) return NT_STATUS_UNSUCCESSFUL;
 
-	*group_name = group->private.name;
+	*group_name = group->private.group_name;
 
 	return NT_STATUS_OK;
 
 }
-NTSTATUS sam_get_group_comment(const SAM_GROUP_HANDLE *group, char **comment)
+NTSTATUS sam_get_group_comment(const SAM_GROUP_HANDLE *group, char **group_desc)
 {
 	if (!group) return NT_STATUS_UNSUCCESSFUL;
 
-	*comment = group->private.comment;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_group_priv_set(const SAM_GROUP_HANDLE *group, PRIVILEGE_SET *priv_set)
-{
-	if (!group) return NT_STATUS_UNSUCCESSFUL;
-
-	*priv_set = group->private.privileges;
+	*group_desc = group->private.group_desc;
 
 	return NT_STATUS_OK;
 }
 
 /* sam group set functions */
 
-NTSTATUS sam_set_group_sid(SAM_GROUP_HANDLE *group, DOM_SID *sid)
+NTSTATUS sam_set_group_sid(SAM_GROUP_HANDLE *group, const DOM_SID *sid)
 {
 	if (!group) return NT_STATUS_UNSUCCESSFUL;
 
@@ -84,11 +75,11 @@ NTSTATUS sam_set_group_sid(SAM_GROUP_HAN
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_group_typ(SAM_GROUP_HANDLE *group, uint32 typ)
+NTSTATUS sam_set_group_group_ctrl(SAM_GROUP_HANDLE *group, const uint32 group_ctrl)
 {
 	if (!group) return NT_STATUS_UNSUCCESSFUL;
 
-	group->private.flags = typ;
+	group->private.group_ctrl = group_ctrl;
 
 	return NT_STATUS_OK;
 }
@@ -97,27 +88,17 @@ NTSTATUS sam_set_group_name(SAM_GROUP_HA
 {
 	if (!group) return NT_STATUS_UNSUCCESSFUL;
 
-	group->private.name = talloc_strdup(group->mem_ctx, group_name);
+	group->private.group_name = talloc_strdup(group->mem_ctx, group_name);
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_group_comment(SAM_GROUP_HANDLE *group, char *comment)
+NTSTATUS sam_set_group_description(SAM_GROUP_HANDLE *group, const char *group_desc)
 {
 	if (!group) return NT_STATUS_UNSUCCESSFUL;
 
-	group->private.comment = talloc_strdup(group->mem_ctx, comment);
+	group->private.group_desc = talloc_strdup(group->mem_ctx, group_desc);
 
 	return NT_STATUS_OK;
 
-}
-
-NTSTATUS sam_set_group_priv_set(SAM_GROUP_HANDLE *group, PRIVILEGE_SET *priv_set)
-{
-	if (!group) return NT_STATUS_UNSUCCESSFUL;
-
-	if (!priv_set) ZERO_STRUCT(group->private.privileges);
-	else memcpy(&(group->private.privileges), priv_set, sizeof(PRIVILEGE_SET));
-
-	return NT_STATUS_OK;
 }
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=.#* HEAD/source/sam/group.c HEAD-fix/source/sam/group.c
--- HEAD/source/sam/group.c	Thu Jan  1 01:00:00 1970
+++ HEAD-fix/source/sam/group.c	Thu Sep  5 04:29:20 2002
@@ -0,0 +1,193 @@
+/* 
+   Unix SMB/CIFS implementation.
+   SAM_GROUP_HANDLE /SAM_GROUP_ENUM helpers
+   
+   Copyright (C) Stefan (metze) Metzmacher 	2002
+      
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_SAM
+
+/************************************************************
+ Fill the SAM_GROUP_HANDLE with default values.
+ ***********************************************************/
+
+static void sam_fill_default_group(SAM_GROUP_HANDLE *group)
+{
+	ZERO_STRUCT(group->private); /* Don't touch the talloc context */
+
+}	
+
+static void destroy_sam_group_handle_talloc(SAM_GROUP_HANDLE **group) 
+{
+	if (*group) {
+
+		talloc_destroy((*group)->mem_ctx);
+		*group = NULL;
+	}
+}
+
+
+/**********************************************************************
+ Alloc memory and initialises a SAM_GROUP_HANDLE on supplied mem_ctx.
+***********************************************************************/
+
+NTSTATUS sam_init_group_talloc(TALLOC_CTX *mem_ctx, SAM_GROUP_HANDLE **group)
+{
+	SMB_ASSERT(*group != NULL);
+
+	if (!mem_ctx) {
+		DEBUG(0,("sam_init_group_talloc: mem_ctx was NULL!\n"));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	*group=(SAM_GROUP_HANDLE *)talloc(mem_ctx, sizeof(SAM_GROUP_HANDLE));
+
+	if (*group==NULL) {
+		DEBUG(0,("sam_init_group_talloc: error while allocating memory\n"));
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	(*group)->mem_ctx = mem_ctx;
+
+	(*group)->free_fn = NULL;
+
+	sam_fill_default_group(*group);
+	
+	return NT_STATUS_OK;
+}
+
+
+/*************************************************************
+ Alloc memory and initialises a struct SAM_GROUP_HANDLE.
+ ************************************************************/
+
+NTSTATUS sam_init_group(SAM_GROUP_HANDLE **group)
+{
+	TALLOC_CTX *mem_ctx;
+	NTSTATUS nt_status;
+	
+	mem_ctx = talloc_init_named("sam internal SAM_GROUP_HANDLE allocation");
+
+	if (!mem_ctx) {
+		DEBUG(0,("sam_init_group: error while doing talloc_init()\n"));
+		return NT_STATUS_NO_MEMORY;
+	}
+
+	if (!NT_STATUS_IS_OK(nt_status = sam_init_group_talloc(mem_ctx, group))) {
+		talloc_destroy(mem_ctx);
+		return nt_status;
+	}
+	
+	(*group)->free_fn = destroy_sam_group_handle_talloc;
+
+	return NT_STATUS_OK;
+}
+
+
+/************************************************************
+ Reset the SAM_GROUP_HANDLE.
+ ***********************************************************/
+
+NTSTATUS sam_reset_group(SAM_GROUP_HANDLE *group)
+{
+	SMB_ASSERT(group != NULL);
+
+	sam_fill_default_group(group);
+
+	return NT_STATUS_OK;
+}
+
+
+/************************************************************
+ Free the SAM_GROUP_HANDLE and the member pointers.
+ ***********************************************************/
+
+NTSTATUS sam_free_group(SAM_ACCOUNT_HANDLE **group)
+{
+	SMB_ASSERT(*group != NULL);
+
+	if ((*group)->free_fn) {
+		(*group)->free_fn(group);
+	}
+
+	return NT_STATUS_OK;	
+}
+
+
+/**********************************************************
+ Encode the group control bits into a string.
+ length = length of string to encode into (including terminating
+ null). length *MUST BE MORE THAN 2* !
+ **********************************************************/
+
+char *sam_encode_acct_ctrl(uint16 group_ctrl, size_t length)
+{
+	static fstring group_str;
+	size_t i = 0;
+
+	group_str[i++] = '[';
+
+	if (group_ctrl & GCB_LOCAL_GROUP )	group_str[i++] = 'L';
+	if (group_ctrl & GCB_GLOBAL_GROUP )	group_str[i++] = 'G';
+
+	for ( ; i < length - 2 ; i++ )
+		group_str[i] = ' ';
+
+	i = length - 2;
+	group_str[i++] = ']';
+	group_str[i++] = '\0';
+
+	return group_str;
+}     
+
+/**********************************************************
+ Decode the group control bits from a string.
+ **********************************************************/
+
+uint16 sam_decode_group_ctrl(const char *p)
+{
+	uint16 group_ctrl = 0;
+	BOOL finished = False;
+
+	/*
+	 * Check if the account type bits have been encoded after the
+	 * NT password (in the form [NDHTUWSLXI]).
+	 */
+
+	if (*p != '[')
+		return 0;
+
+	for (p++; *p && !finished; p++) {
+		switch (*p) {
+			case 'L': { group_ctrl |= GCB_LOCAL_GROUP; break; /* 'L'ocal Aliases Group. */ } 
+			case 'G': { group_ctrl |= GCB_GLOBAL_GROUP; break; /* 'G'lobal Domain Group. */ } 
+			
+		        case ' ': { break; }
+			case ':':
+			case '\n':
+			case '\0': 
+			case ']':
+			default:  { finished = True; }
+		}
+	}
+
+	return group_ctrl;
+}
+
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=.#* HEAD/source/sam/interface.c HEAD-fix/source/sam/interface.c
--- HEAD/source/sam/interface.c	Thu Aug 29 16:26:44 2002
+++ HEAD-fix/source/sam/interface.c	Fri Sep  6 07:55:11 2002
@@ -354,7 +354,7 @@ NTSTATUS context_sam_get_domain_by_sid(c
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_create_account(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, DOM_SID *domainsid, SAM_ACCOUNT_HANDLE **account)
+NTSTATUS context_sam_create_account(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, const char *account_name, uint16 acct_ctrl, SAM_ACCOUNT_HANDLE **account)
 {
 	SAM_METHODS	*tmp_methods;
 	NTSTATUS	nt_status;
@@ -371,7 +371,7 @@ NTSTATUS context_sam_create_account(cons
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_create_account(tmp_methods, access_token, access_desired, account))) {
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_create_account(tmp_methods, access_token, access_desired, account_name, acct_ctrl, account))) {
 		DEBUG(4,("context_sam_create_account in backend %s failed\n",
 				 tmp_methods->backendname));
 		return nt_status;
@@ -494,7 +494,7 @@ NTSTATUS context_sam_delete_account(cons
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_enum_accounts(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, int32 *account_count, SAM_ACCOUNT_ENUM **accounts)
+NTSTATUS context_sam_enum_accounts(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, uint16 acct_ctrl, int32 *account_count, SAM_ACCOUNT_ENUM **accounts)
 {
 	SAM_METHODS	*tmp_methods;
 	NTSTATUS	nt_status;
@@ -511,7 +511,7 @@ NTSTATUS context_sam_enum_accounts(const
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_enum_accounts(tmp_methods, access_token, account_count, accounts))) {
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_enum_accounts(tmp_methods, access_token, acct_ctrl, account_count, accounts))) {
 		DEBUG(4,("context_sam_enum_accounts for domain %s in backend %s failed\n",
 				 tmp_methods->domain->private.name, tmp_methods->backendname));
 		return nt_status;
@@ -582,14 +582,14 @@ NTSTATUS context_sam_get_account_by_name
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_create_group(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const uint32 type, DOM_SID *sid, SAM_GROUP_HANDLE **group)
+NTSTATUS context_sam_create_group(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, const char *group_name, uint16 group_ctrl, SAM_GROUP_HANDLE **group)
 {
 	SAM_METHODS	*tmp_methods;
 	NTSTATUS	nt_status;
 
 	DEBUG(5,("context_sam_create_group: %d\n", __LINE__));
 
-	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, sid))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, domainsid))) {
 		DEBUG(4,("sam_get_methods_by_sid failed\n"));
 		return nt_status;
 	}
@@ -599,7 +599,7 @@ NTSTATUS context_sam_create_group(const 
 		return NT_STATUS_UNSUCCESSFUL; 
 	}
 
-	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_create_group(tmp_methods, access_token, access_desired, type, group))) {
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_create_group(tmp_methods, access_token, access_desired, group_name, group_ctrl, group))) {
 		DEBUG(4,("context_sam_create_group in backend %s failed\n",
 				 tmp_methods->backendname));
 		return nt_status;
@@ -722,7 +722,7 @@ NTSTATUS context_sam_delete_group(const 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_enum_groups(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups)
+NTSTATUS context_sam_enum_groups(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, uint16 group_ctrl, uint32 *groups_count, SAM_GROUP_ENUM **groups)
 {
 	SAM_METHODS	*tmp_methods;
 	NTSTATUS	nt_status;
@@ -739,7 +739,7 @@ NTSTATUS context_sam_enum_groups(const S
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_enum_groups(tmp_methods, access_token, type, groups_count, groups))) {
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_enum_groups(tmp_methods, access_token, group_ctrl, groups_count, groups))) {
 		DEBUG(4,("context_sam_enum_groups for domain %s in backend %s failed\n",
 				 tmp_methods->domain->private.name, tmp_methods->backendname));
 		return nt_status;
@@ -823,7 +823,7 @@ NTSTATUS context_sam_enum_groupmembers(c
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS context_sam_get_groups_of_account(const SAM_CONTEXT *context, const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups)
+NTSTATUS context_sam_get_groups_of_sid(const SAM_CONTEXT *context, const DOM_SID **sids, uint16 group_ctrl, uint32 *group_count, SAM_GROUP_ENUM **groups)
 {
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=.#* HEAD/examples/sam/sam_skel.c HEAD-fix/examples/sam/sam_skel.c
--- HEAD/examples/sam/sam_skel.c	Sat Aug 31 15:36:26 2002
+++ HEAD-fix/examples/sam/sam_skel.c	Fri Sep  6 07:16:33 2002
@@ -32,26 +32,26 @@ SAM_MODULE_VERSIONING_MAGIC
 
 /* General API */
 
-NTSTATUS sam_skel_get_sec_desc(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd)
+NTSTATUS sam_skel_get_sec_desc(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_set_sec_desc(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd)
+NTSTATUS sam_skel_set_sec_desc(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
 	
-NTSTATUS sam_skel_lookup_sid(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type)
+NTSTATUS sam_skel_lookup_sid(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_lookup_name(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const char *name, DOM_SID **sid, uint32 *type)
+NTSTATUS sam_skel_lookup_name(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const char *name, DOM_SID **sid, uint32 *type)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
@@ -60,13 +60,13 @@ NTSTATUS sam_skel_lookup_name(const stru
 	
 /* Domain API */
 
-NTSTATUS sam_skel_update_domain(const struct sam_methods *sam_method, const SAM_DOMAIN_HANDLE *domain)
+NTSTATUS sam_skel_update_domain(const SAM_METHODS *sam_method, const SAM_DOMAIN_HANDLE *domain)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_get_domain_handle(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, SAM_DOMAIN_HANDLE **domain)
+NTSTATUS sam_skel_get_domain_handle(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, SAM_DOMAIN_HANDLE **domain)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
@@ -75,44 +75,44 @@ NTSTATUS sam_skel_get_domain_handle(cons
 
 /* Account API */
 
-NTSTATUS sam_skel_create_account(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, SAM_ACCOUNT_HANDLE **account)
+NTSTATUS sam_skel_create_account(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *group_name, uint16 acct_ctrl, SAM_ACCOUNT_HANDLE **account)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_add_account(const struct sam_methods *sam_method, const SAM_ACCOUNT_HANDLE *account)
+NTSTATUS sam_skel_add_account(const SAM_METHODS *sam_method, const SAM_ACCOUNT_HANDLE *account)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_update_account(const struct sam_methods *sam_method, const SAM_ACCOUNT_HANDLE *account)
+NTSTATUS sam_skel_update_account(const SAM_METHODS *sam_method, const SAM_ACCOUNT_HANDLE *account)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_delete_account(const struct sam_methods *sam_method, const SAM_ACCOUNT_HANDLE *account)
+NTSTATUS sam_skel_delete_account(const SAM_METHODS *sam_method, const SAM_ACCOUNT_HANDLE *account)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_enum_accounts(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, int32 *account_count, SAM_ACCOUNT_ENUM **accounts)
+NTSTATUS sam_skel_enum_accounts(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, uint16 acct_ctrl, uint32 *account_count, SAM_ACCOUNT_ENUM **accounts)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
 
-NTSTATUS sam_skel_get_account_by_sid(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account)
+NTSTATUS sam_skel_get_account_by_sid(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_get_account_by_name(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_ACCOUNT_HANDLE **account)
+NTSTATUS sam_skel_get_account_by_name(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_ACCOUNT_HANDLE **account)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
@@ -121,69 +121,69 @@ NTSTATUS sam_skel_get_account_by_name(co
 
 /* Group API */
 
-NTSTATUS sam_skel_create_group(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const uint32 type, SAM_GROUP_HANDLE **group)
+NTSTATUS sam_skel_create_group(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *account_name, uint16 group_ctrl, SAM_GROUP_HANDLE **group)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_add_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group)
+NTSTATUS sam_skel_add_group(const SAM_METHODS *sam_method, const SAM_GROUP_HANDLE *group)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_update_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group)
+NTSTATUS sam_skel_update_group(const SAM_METHODS *sam_method, const SAM_GROUP_HANDLE *group)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_delete_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group)
+NTSTATUS sam_skel_delete_group(const SAM_METHODS *sam_method, const SAM_GROUP_HANDLE *group)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_enum_groups(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups)
+NTSTATUS sam_skel_enum_groups(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, uint16 group_ctrl, uint32 *groups_count, SAM_GROUP_ENUM **groups)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_get_group_by_sid(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group)
+NTSTATUS sam_skel_get_group_by_sid(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_get_group_by_name(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_GROUP_HANDLE **group)
+NTSTATUS sam_skel_get_group_by_name(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_GROUP_HANDLE **group)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
 
-NTSTATUS sam_skel_add_member_to_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
+NTSTATUS sam_skel_add_member_to_group(const SAM_METHODS *sam_method, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_delete_member_from_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
+NTSTATUS sam_skel_delete_member_from_group(const SAM_METHODS *sam_method, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS sam_skel_enum_groupmembers(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members)
+NTSTATUS sam_skel_enum_groupmembers(const SAM_METHODS *sam_method, const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
 
-NTSTATUS sam_skel_get_groups_of_account(const struct sam_methods *sam_method, const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups)
+NTSTATUS sam_skel_get_groups_of_sid(const SAM_METHODS *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID **sids, uint16 group_ctrl, uint32 *group_count, SAM_GROUP_ENUM **groups)
 {
 	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
 	return NT_STATUS_NOT_IMPLEMENTED;
@@ -238,7 +238,7 @@ NTSTATUS sam_init(const SAM_CONTEXT *sam
 	(*sam_method)->sam_delete_member_from_group = sam_skel_delete_member_from_group;
 	(*sam_method)->sam_enum_groupmembers = sam_skel_enum_groupmembers;
 
-	(*sam_method)->sam_get_groups_of_account = sam_skel_get_groups_of_account;
+	(*sam_method)->sam_get_groups_of_sid = sam_skel_get_groups_of_sid;
 
 	(*sam_method)->free_private_data = NULL;
 
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=.#* HEAD/source/include/sam.h HEAD-fix/source/include/sam.h
--- HEAD/source/include/sam.h	Mon Sep  2 15:06:55 2002
+++ HEAD-fix/source/include/sam.h	Fri Sep  6 09:39:44 2002
@@ -25,7 +25,9 @@
 #ifndef _SAM_H
 #define _SAM_H
 
-#define SAM_INTERFACE_VERSION 1
+
+/* let it be 0 until we have a stable interface --metze */
+#define SAM_INTERFACE_VERSION 0
 
 /* use this inside a passdb module */
 #define SAM_MODULE_VERSIONING_MAGIC \
@@ -104,12 +106,11 @@ typedef struct sam_group_handle {
 	struct sam_methods *current_sam_methods; /* sam_methods creating this handle */
 	void (*free_fn)(struct sam_group_handle **);
 	struct sam_group_data {
-		char *name;
-		char *comment;
+		char *group_name;
+		char *group_desc;
 		DOM_SID sid;
-		int32 flags; /* specifies if the group is a local group or a global group */
+		uint16 group_ctrl; /* specifies if the group is a local group or a global group */
 		uint32 num_members;
-		PRIVILEGE_SET privileges;
 	} private;
 } SAM_GROUP_HANDLE;
 
@@ -117,7 +118,6 @@ typedef struct sam_group_handle {
 typedef struct sam_group_member {
 	DOM_SID sid; 
 	BOOL group; /* specifies if it is a group or a account */ 
-
 } SAM_GROUP_MEMBER;
 
 typedef struct sam_account_enum {
@@ -125,15 +125,23 @@ typedef struct sam_account_enum {
 	char *account_name; 
 	char *full_name; 
 	char *account_desc; 
-	uint16 acc_ctrl; 
+	uint16 acct_ctrl; 
 } SAM_ACCOUNT_ENUM;
 
 typedef struct sam_group_enum {
 	DOM_SID sid;
-	char *groupname;
-	char *comment;
+	char *group_name;
+	char *group_desc;
+	uint16 group_ctrl;
 } SAM_GROUP_ENUM;
 
+
+/* bits for group_ctrl: to spezify if the group is global group or alias */
+#define GCB_LOCAL_GROUP	0x0001
+#define GCB_ALIAS_GROUP	GCB_LOCAL_GROUP
+#define GCB_GLOBAL_GROUP	0x0002
+
+
 typedef struct sam_context 
 {
 	struct sam_methods *methods;
@@ -160,22 +168,22 @@ typedef struct sam_context 
 
 	/* Account API */
 
-	NTSTATUS (*sam_create_account) (const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_ACCOUNT_HANDLE **account);
+	NTSTATUS (*sam_create_account) (const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, const char *account_name, uint16 acct_ctrl, SAM_ACCOUNT_HANDLE **account);
 	NTSTATUS (*sam_add_account) (const struct sam_context *, const DOM_SID *domainsid, const SAM_ACCOUNT_HANDLE *account);
 	NTSTATUS (*sam_update_account) (const struct sam_context *, const SAM_ACCOUNT_HANDLE *account);
 	NTSTATUS (*sam_delete_account) (const struct sam_context *, const SAM_ACCOUNT_HANDLE *account);
-	NTSTATUS (*sam_enum_accounts) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *domain, int32 *account_count, SAM_ACCOUNT_ENUM **accounts);
+	NTSTATUS (*sam_enum_accounts) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *domain, uint16 acct_ctrl, uint32 *account_count, SAM_ACCOUNT_ENUM **accounts);
 
 	NTSTATUS (*sam_get_account_by_sid) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account);
 	NTSTATUS (*sam_get_account_by_name) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_ACCOUNT_HANDLE **account);
 
 	/* Group API */
 
-
+	NTSTATUS (*sam_create_group) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, const char *group_name, uint16 group_ctrl, SAM_GROUP_HANDLE **group);
 	NTSTATUS (*sam_add_group) (const struct sam_context *, const DOM_SID *domainsid, const SAM_GROUP_HANDLE *group);
 	NTSTATUS (*sam_update_group) (const struct sam_context *, const SAM_GROUP_HANDLE *group);
 	NTSTATUS (*sam_delete_group) (const struct sam_context *, const SAM_GROUP_HANDLE *group);
-	NTSTATUS (*sam_enum_groups) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups);
+	NTSTATUS (*sam_enum_groups) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, const uint16 group_ctrl, uint32 *groups_count, SAM_GROUP_ENUM **groups);
 	NTSTATUS (*sam_get_group_by_sid) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group);
 	NTSTATUS (*sam_get_group_by_name) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_GROUP_HANDLE **group);
 
@@ -183,8 +191,7 @@ typedef struct sam_context 
 	NTSTATUS (*sam_delete_member_from_group) (const struct sam_context *, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member);
 	NTSTATUS (*sam_enum_groupmembers) (const struct sam_context *, const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members);
 
-	NTSTATUS (*sam_get_groups_of_account) (const struct sam_context *, const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups);
-
+	NTSTATUS (*sam_get_groups_of_sid) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID **sids, const uint16 group_ctrl, uint32 *group_count, SAM_GROUP_ENUM **groups);
 	void (*free_fn)(struct sam_context **);
 } SAM_CONTEXT;
 
@@ -212,22 +219,22 @@ typedef struct sam_methods 
 
 	/* Account API */
 
-	NTSTATUS (*sam_create_account) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, SAM_ACCOUNT_HANDLE **account);
+	NTSTATUS (*sam_create_account) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *account_name, uint16 acct_ctrl, SAM_ACCOUNT_HANDLE **account);
 	NTSTATUS (*sam_add_account) (const struct sam_methods *, const SAM_ACCOUNT_HANDLE *account);
 	NTSTATUS (*sam_update_account) (const struct sam_methods *, const SAM_ACCOUNT_HANDLE *account);
 	NTSTATUS (*sam_delete_account) (const struct sam_methods *, const SAM_ACCOUNT_HANDLE *account);
-	NTSTATUS (*sam_enum_accounts) (const struct sam_methods *, const NT_USER_TOKEN *access_token, int32 *account_count, SAM_ACCOUNT_ENUM **accounts);
+	NTSTATUS (*sam_enum_accounts) (const struct sam_methods *, const NT_USER_TOKEN *access_token, uint16 acct_ctrl, uint32 *account_count, SAM_ACCOUNT_ENUM **accounts);
 
 	NTSTATUS (*sam_get_account_by_sid) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account);
 	NTSTATUS (*sam_get_account_by_name) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_ACCOUNT_HANDLE **account);
 
 	/* Group API */
 
-	NTSTATUS (*sam_create_group) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const uint32 type, SAM_GROUP_HANDLE **group);
+	NTSTATUS (*sam_create_group) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *group_name, uint16 group_ctrl, SAM_GROUP_HANDLE **group);
 	NTSTATUS (*sam_add_group) (const struct sam_methods *, const SAM_GROUP_HANDLE *group);
 	NTSTATUS (*sam_update_group) (const struct sam_methods *, const SAM_GROUP_HANDLE *group);
 	NTSTATUS (*sam_delete_group) (const struct sam_methods *, const SAM_GROUP_HANDLE *group);
-	NTSTATUS (*sam_enum_groups) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups);
+	NTSTATUS (*sam_enum_groups) (const struct sam_methods *, const NT_USER_TOKEN *access_token, uint16 group_ctrl, uint32 *groups_count, SAM_GROUP_ENUM **groups);
 	NTSTATUS (*sam_get_group_by_sid) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group);
 	NTSTATUS (*sam_get_group_by_name) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_GROUP_HANDLE **group);
 
@@ -235,7 +242,7 @@ typedef struct sam_methods 
 	NTSTATUS (*sam_delete_member_from_group) (const struct sam_methods *, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member);
 	NTSTATUS (*sam_enum_groupmembers) (const struct sam_methods *, const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members);
 
-	NTSTATUS (*sam_get_groups_of_account) (const struct sam_methods *, const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups);
+	NTSTATUS (*sam_get_groups_of_sid) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const DOM_SID **sids, uint16 group_ctrl, uint32 *group_count, SAM_GROUP_ENUM **groups);
 
 	void (*free_private_data)(void **);
 } SAM_METHODS;


More information about the samba-technical mailing list