Viewing file: libmsrpc.h (92.7 KB) -rwxr-xr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* * Unix SMB/CIFS implementation. * MS-RPC client library API definitions/prototypes * * Copyright (C) Chris Nicholls 2005. * * 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. */
#ifndef LIBMSRPC_H #define LIBMSRPC_H
#include "includes.h" #include "libsmbclient.h" #include "libsmb_internal.h"
/*server capability levels*/ #define SRV_WIN_NT4 1 #define SRV_WIN_2K 2 #define SRV_WIN_2K_SP3 3 #define SRV_WIN_2K3 4
/**@defgroup handle Server Handle*/ /**@defgroup Library_Functions Library/Utility Functions*/ /**@defgroup lsa_defs LSA Definitions*/ /**@defgroup LSA_Functions LSA Functions*/ /**@defgroup reg_defs Registry Definitions*/ /**@defgroup Reg_Functions Registry Functions*/ /**@defgroup sam_defs SAM Definitions*/ /**@defgroup SAM_Functions SAM Functions*/ /**@defgroup svc_defs Service Control Definitions*/ /**@defgroup SCM_Functions Service Control Functions*/
/**Operation was unsuccessful*/ #define CAC_FAILURE 0 /**Operation was successful*/ #define CAC_SUCCESS 1 /**Operation was only partially successful * an example of this is if you try to lookup a list of accounts to SIDs and not all accounts can be resolved*/ #define CAC_PARTIAL_SUCCESS 2
/**@ingroup CAC_errors Use this to see if the last operation failed - useful for enumeration functions that use multiple calls*/ #define CAC_OP_FAILED(status) !NT_STATUS_IS_OK(status) && \ NT_STATUS_V(status) != NT_STATUS_V(STATUS_SOME_UNMAPPED) && \ NT_STATUS_V(status) != NT_STATUS_V(STATUS_NO_MORE_FILES) && \ NT_STATUS_V(status) != NT_STATUS_V(NT_STATUS_NO_MORE_ENTRIES) && \ NT_STATUS_V(status) != NT_STATUS_V(NT_STATUS_NONE_MAPPED) && \ NT_STATUS_V(status) != NT_STATUS_V(NT_STATUS_GUIDS_EXHAUSTED)
/**Privilege string constants*/ #define CAC_SE_CREATE_TOKEN "SeCreateTokenPrivilege" #define CAC_SE_ASSIGN_PRIMARY_TOKEN "SeAssignPrimaryTokenPrivilege" #define CAC_SE_LOCK_MEMORY "SeLockMemoryPrivilege" #define CAC_SE_INCREASE_QUOTA "SeIncreaseQuotaPrivilege" #define CAC_SE_MACHINE_ACCOUNT "SeMachineAccountPrivilege" #define CAC_SE_TCB "SeTcbPrivilege" #define CAC_SE_SECURITY "SeSecurityPrivilege" #define CAC_SE_TAKE_OWNERSHIP "SeTakeOwnershipPrivilege" #define CAC_SE_LOAD_DRIVER "SeLoadDriverPrivilege" #define CAC_SE_SYSTEM_PROFILE "SeSystemProfilePrivilege" #define CAC_SE_SYSTEM_TIME "SeSystemtimePrivilege" #define CAC_SE_PROFILE_SINGLE_PROC "SeProfileSingleProcessPrivilege" #define CAC_SE_INCREASE_BASE_PRIORITY "SeIncreaseBasePriorityPrivilege" #define CAC_SE_CREATE_PAGEFILE "SeCreatePagefilePrivilege" #define CAC_SE_CREATE_PERMANENT "SeCreatePermanentPrivilege" #define CAC_SE_BACKUP "SeBackupPrivilege" #define CAC_SE_RESTORE "SeRestorePrivilege" #define CAC_SE_SHUTDOWN "SeShutdownPrivilege" #define CAC_SE_DEBUG "SeDebugPrivilege" #define CAC_SE_AUDIT "SeAuditPrivilege" #define CAC_SE_SYSTEM_ENV "SeSystemEnvironmentPrivilege" #define CAC_SE_CHANGE_NOTIFY "SeChangeNotifyPrivilege" #define CAC_SE_REMOTE_SHUTDOWN "SeRemoteShutdownPrivilege" #define CAC_SE_UNDOCK "SeUndockPrivilege" #define CAC_SE_SYNC_AGENT "SeSyncAgentPrivilege" #define CAC_SE_ENABLE_DELEGATION "SeEnableDelegationPrivilege" #define CAC_SE_MANAGE_VOLUME "SeManageVolumePrivilege" #define CAC_SE_IMPERSONATE "SeImpersonatePrivilege" #define CAC_SE_CREATE_GLOBAL "SeCreateGlobalPrivilege" #define CAC_SE_PRINT_OPERATOR "SePrintOperatorPrivilege" #define CAC_SE_NETWORK_LOGON "SeNetworkLogonRight" #define CAC_SE_INTERACTIVE_LOGON "SeInteractiveLogonRight" #define CAC_SE_BATCH_LOGON "SeBatchLogonRight" #define CAC_SE_SERVICE_LOGON "SeServiceLogonRight" #define CAC_SE_ADD_USERS "SeAddUsersPrivilege" #define CAC_SE_DISK_OPERATOR "SeDiskOperatorPrivilege"
/** * @addtogroup lsa_defs * @{ */ /**used to specify what data to retrieve using cac_LsaQueryTrustedDomainInformation*/ #define CAC_INFO_TRUSTED_DOMAIN_NAME 0x1 #define CAC_INFO_TRUSTED_DOMAIN_POSIX_OFFSET 0x3 #define CAC_INFO_TRUSTED_DOMAIN_PASSWORD 0x4
/**Used when requesting machine domain information*/ #define CAC_DOMAIN_INFO 0x0003
/**Used when requesting machine local information*/ #define CAC_LOCAL_INFO 0x0005
/**Stores information about a SID*/ typedef struct _CACSIDINFO { /**The actual SID*/ DOM_SID sid; /**The name of the object which maps to this SID*/ char *name;
/**The domain the SID belongs to*/ char *domain; } CacSidInfo; /* @} */
/** * @addtogroup reg_defs * @{ */ /**Null terminated string*/ typedef char* REG_SZ_DATA;
/**Null terminated string with windows environment variables that should be expanded*/ typedef char* REG_EXPAND_SZ_DATA;
/**Binary data of some kind*/ typedef struct _REGBINARYDATA { uint32 data_length; uint8 * data; } REG_BINARY_DATA; /**32-bit (little endian) number*/ typedef uint32 REG_DWORD_DATA;
/**32-bit big endian number*/ typedef uint32 REG_DWORD_BE_DATA;
/**array of strings*/ typedef struct _REGMULTISZDATA { uint32 num_strings;
char **strings; } REG_MULTI_SZ_DATA;
typedef union _REGVALUEDATA { REG_SZ_DATA reg_sz; REG_EXPAND_SZ_DATA reg_expand_sz; REG_BINARY_DATA reg_binary; REG_DWORD_DATA reg_dword; REG_DWORD_BE_DATA reg_dword_be; REG_MULTI_SZ_DATA reg_multi_sz; } REG_VALUE_DATA; /**@}*/
/** * @addtogroup sam_defs * @{ */
#define CAC_USER_RID 0x1 #define CAC_GROUP_RID 0x2
typedef struct _CACLOOKUPRIDSRECORD { char *name; uint32 rid;
/**If found, this will be one of: * - CAC_USER_RID * - CAC_GROUP_RID */ uint32 type; /*if the name or RID was looked up, then found = True*/ BOOL found; } CacLookupRidsRecord;
typedef struct _CACUSERINFO { /**Last logon time*/ time_t logon_time;
/**Last logoff time*/ time_t logoff_time;
/**Last kickoff time*/ time_t kickoff_time;
/**Last password set time*/ time_t pass_last_set_time;
/**Time password can change*/ time_t pass_can_change_time;
/**Time password must change*/ time_t pass_must_change_time;
/**LM user password*/ uint8 lm_password[8];
/**NT user password*/ uint8 nt_password[8];
/**User's RID*/ uint32 rid;
/**RID of primary group*/ uint32 group_rid;
/**User's ACB mask*/ uint32 acb_mask;
/**Bad password count*/ uint16 bad_passwd_count;
/**Number of logons*/ uint16 logon_count;
/**Change password at next logon?*/ BOOL pass_must_change;
/**Username*/ char *username;
/**User's full name*/ char *full_name;
/**User's home directory*/ char *home_dir;
/**Home directory drive*/ char *home_drive;
/**Logon script*/ char *logon_script;
/**Path to profile*/ char *profile_path;
/**Account description*/ char *description;
/**Login from workstations*/ char *workstations;
char *dial;
/**Possible logon hours*/ LOGON_HRS *logon_hours;
} CacUserInfo;
typedef struct _CACGROUPINFO { /**Group name*/ char *name;
/**Description*/ char *description; /**Number of members*/ uint32 num_members; } CacGroupInfo, CacAliasInfo;
/**Represents a period (duration) of time*/ typedef struct _CACTIME { /**Number of days*/ uint32 days;
/**Number of hours*/ uint32 hours;
/**Number of minutes*/ uint32 minutes;
/**number of seconds*/ uint32 seconds; } CacTime;
typedef struct _CACDOMINFO { /**The server role. Should be one of: * ROLE_STANDALONE * ROLE_DOMAIN_MEMBER * ROLE_DOMAIN_BDC * ROLE_DOMAIN_PDC * see include/smb.h */ uint32 server_role;
/**Number of domain users*/ uint32 num_users;
/**Number of domain groups*/ uint32 num_domain_groups; /**Number of local groups*/ uint32 num_local_groups;
/**Comment*/ char *comment;
/**Domain name*/ char *domain_name;
/**Server name*/ char *server_name;
/**Minimum password length*/ uint16 min_pass_length;
/**How many previous passwords to remember - ie, password cannot be the same as N previous passwords*/ uint16 pass_history;
/**How long (from now) before passwords expire*/ CacTime expire;
/**How long (from now) before passwords can be changed*/ CacTime min_pass_age;
/**How long users are locked out for too many bad password attempts*/ CacTime lockout_duration;
/**How long before lockouts are reset*/ CacTime lockout_reset;
/**How many bad password attempts before lockout occurs*/ uint16 num_bad_attempts; } CacDomainInfo;
/**@}*/ /*sam_defs*/
/**@addtogroup svc_defs * @{ */ typedef struct _CACSERVICE { /**The service name*/ char *service_name;
/**The display name of the service*/ char *display_name; /**Current status of the service - see include/rpc_svcctl.h for SERVICE_STATUS definition*/ SERVICE_STATUS status; } CacService;
typedef struct __CACSERVICECONFIG { /**The service type*/ uint32 type;
/**The start type. Should be one of: * - SVCCTL_BOOT_START * - SVCCTL_SYSTEM_START * - SVCCTL_AUTO_START * - SVCCTL_DEMAND_START */ uint32 start_type;
uint32 error_control;
/**Path to executable*/ char *exe_path;
/***/ char *load_order_group;
uint32 tag_id;
/**Any dependencies for the service*/ char *dependencies;
/**Run as...*/ char *start_name;
/**Service display name*/ char *display_name; } CacServiceConfig; /**@}*/ /*svc_defs*/
#include "libmsrpc_internal.h"
/** * @addtogroup handle * @{ */
/** * Server handle used to keep track of client/server/pipe information. Use cac_NewServerHandle() to allocate. * Initiliaze as many values as possible before calling cac_Connect(). * * @note When allocating memory for the fields, use SMB_MALLOC() (or equivalent) instead of talloc() (or equivalent) - * If memory is not allocated for a field, cac_Connect will allocate sizeof(fstring) bytes for it. * * @note It may be wise to allocate large buffers for these fields and strcpy data into them. * * @see cac_NewServerHandle() * @see cac_FreeHandle() */ typedef struct _CACSERVERHANDLE { /** debug level */ int debug;
/** netbios name used to make connections */ char *netbios_name;
/** domain name used to make connections */ char *domain;
/** username used to make connections */ char *username;
/** user's password plain text string */ char *password;
/** name or IP address of server we are currently working with */ char *server;
/**stores the latest NTSTATUS code */ NTSTATUS status; /** internal. do not modify! */ struct CacServerHandleInternal _internal;
} CacServerHandle;
/*@}*/
/**internal function. do not call this function*/ SMBCSRV *cac_GetServer(CacServerHandle *hnd);
/** @addtogroup Library_Functions * @{ */ /** * Initializes the library - do not need to call this function. Open's smb.conf as well as initializes logging. * @param debug Debug level for library to use */
void cac_Init(int debug);
/** * Creates an un-initialized CacServerHandle * @param allocate_fields If True, the function will allocate sizeof(fstring) bytes for all char * fields in the handle * @return - un-initialized server handle * - NULL if no memory could be allocated */ CacServerHandle * cac_NewServerHandle(BOOL allocate_fields);
/** * Specifies the smbc_get_auth_data_fn to use if you do not want to use the default. * @param hnd non-NULL server handle * @param auth_fn auth_data_fn to set in server handle */
void cac_SetAuthDataFn(CacServerHandle *hnd, smbc_get_auth_data_fn auth_fn);
/** Use your own libsmbclient context - not necessary. * @note You must still call cac_Connect() after specifying your own libsmbclient context * @param hnd Initialized, but not connected CacServerHandle * @param ctx The libsmbclient context you would like to use. */ void cac_SetSmbcContext(CacServerHandle *hnd, SMBCCTX *ctx);
/** Connects to a specified server. If there is already a connection to a different server, * it will be cleaned up before connecting to the new server. * @param hnd Pre-initialized CacServerHandle * @param srv (Optional) Name or IP of the server to connect to. If NULL, server from the CacServerHandle will be used. * * @return CAC_FAILURE if the operation could not be completed successfully (hnd->status will also be set with a NTSTATUS code) * @return CAC_SUCCESS if the operation succeeded */ int cac_Connect(CacServerHandle *hnd, const char *srv);
/** * Cleans up any data used by the CacServerHandle. If the libsmbclient context was set using cac_SetSmbcContext(), it will not be free'd. * @param hnd the CacServerHandle to destroy */ void cac_FreeHandle(CacServerHandle * hnd);
/** * Initializes a CacTime structure based on an NTTIME structure * If the function fails, then the CacTime structure will be zero'd out */ void cac_InitCacTime(CacTime *cactime, NTTIME nttime);
/** * Called by cac_NewServerHandle() if allocate_fields = True. You can call this if you want to, allocates sizeof(fstring) char's for every char * field * @param hnd Uninitialized server handle * @return CAC_FAILURE Memory could not be allocated * @return CAC_SUCCESS Memory was allocated */ int cac_InitHandleMem(CacServerHandle *hnd);
/** * Default smbc_get_auth_data_fn for libmsrpc. This function is called when libmsrpc needs to get more information about the * client (username/password, workgroup). * This function provides simple prompts to the user to enter the information. This description his here so you know how to re-define this function. * @see cac_SetAuthDataFn() * @param pServer Name/IP of the server to connect to. * @param pShare Share name to connect to * @param pWorkgroup libmsrpc passes in the workgroup/domain name from hnd->domain. It can be modified in the function. * @param maxLenWorkgroup The maximum length of a string pWogroup can hold. * @param pUsername libmsrpc passes in the username from hnd->username. It can be modified in the function. * @param maxLenUsername The maximum length of a string pUsername can hold. * @param pPassword libmsrpc pass in the password from hnd->password. It can be modified in the function. * @param maxLenPassword The maximum length of a string pPassword can hold. */ void cac_GetAuthDataFn(const char * pServer, const char * pShare, char * pWorkgroup, int maxLenWorkgroup, char * pUsername, int maxLenUsername, char * pPassword, int maxLenPassword);
/**@}*/
/***************** * LSA Functions * *****************/
/** @addtogroup LSA_Functions * @{ */
struct LsaOpenPolicy { /**Inputs*/ struct { /**Access Mask. Refer to Security Access Masks in include/rpc_secdes.h*/ uint32 access;
/**Use security quality of service? (True/False)*/ BOOL security_qos; } in;
/**Outputs*/ struct { /**Handle to the open policy (needed for all other operations)*/ POLICY_HND *pol; } out; };
/** * Opens a policy handle on a remote machine. * @param hnd fully initialized CacServerHandle for remote machine * @param mem_ctx Talloc context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE if the policy could not be opened. hnd->status set with appropriate NTSTATUS * @return CAC_SUCCESS if the policy could be opened, the policy handle can be found */ int cac_LsaOpenPolicy(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaOpenPolicy *op);
/** * Closes an LSA policy handle (Retrieved using cac_LsaOpenPolicy). * If successful, the handle will be closed on the server, and memory for pol will be freed * @param hnd - An initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param pol - the policy handle to close * @return CAC_FAILURE could not close the policy handle, hnd->status is set to the appropriate NTSTATUS error code * @return CAC_SUCCESS the policy handle was closed */ int cac_LsaClosePolicy(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *pol);
struct LsaGetNamesFromSids { struct { /**handle to and open LSA policy*/ POLICY_HND *pol; /**the number of SIDs to lookup*/ uint32 num_sids; /**array of SIDs to lookup*/ DOM_SID *sids; } in;
struct { /**The number of names returned (in case of CAC_PARTIAL_SUCCESS)*/ uint32 num_found;
/**array of SID info each index is one sid */ CacSidInfo *sids;
/**in case of partial success, an array of SIDs that could not be looked up (NULL if all sids were looked up)*/ DOM_SID *unknown; } out; };
/** * Looks up the names for a list of SIDS * @param hnd initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param op input and output parameters * @return CAC_FAILURE none of the SIDs could be looked up hnd->status is set with appropriate NTSTATUS error code * @return CAC_SUCCESS all of the SIDs were translated and a list of names has been output * @return CAC_PARTIAL_SUCCESS not all of the SIDs were translated, as a result the number of returned names is less than the original list of SIDs */ int cac_LsaGetNamesFromSids(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaGetNamesFromSids *op);
struct LsaGetSidsFromNames { struct { /**handle to an open LSA policy*/ POLICY_HND *pol;
/**number of SIDs to lookup*/ uint32 num_names;
/**array of strings listing the names*/ char **names; } in;
struct { /**The number of SIDs returned (in case of partial success*/ uint32 num_found;
/**array of SID info for the looked up names*/ CacSidInfo *sids;
/**in case of partial success, the names that were not looked up*/ char **unknown; } out; };
/** * Looks up the SIDs for a list of names * @param hnd initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param op input and output parameters * @return CAC_FAILURE none of the SIDs could be looked up hnd->status is set with appropriate NTSTATUS error code * @return CAC_SUCCESS all of the SIDs were translated and a list of names has been output * @return CAC_PARTIAL_SUCCESS not all of the SIDs were translated, as a result the number of returned names is less than the original list of SIDs */ int cac_LsaGetSidsFromNames(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaGetSidsFromNames *op);
struct LsaFetchSid { struct { /**handle to an open LSA policy*/ POLICY_HND *pol;
/**can be CAC_LOCAL_INFO, CAC_DOMAIN_INFO, or (CAC_LOCAL_INFO | CAC_DOMAIN_INFO)*/ uint16 info_class; } in;
struct { /**the machine's local SID and domain name (NULL if not asked for)*/ CacSidInfo *local_sid;
/**the machine's domain SID and name (NULL if not asked for)*/ CacSidInfo *domain_sid; } out; };
/** * Looks up the domain or local sid of a machine with an open LSA policy handle * @param hnd initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param op input and output parameters * @return CAC_FAILURE if the SID could not be fetched * @return CAC_SUCCESS if the SID was fetched * @return CAC_PARTIAL_SUCCESS if you asked for both local and domain sids but only one was returned */ int cac_LsaFetchSid(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaFetchSid *op);
struct LsaQueryInfoPolicy { struct { /**Open LSA policy handle on remote server*/ POLICY_HND *pol; } in;
struct { /**remote server's domain name*/ char *domain_name;
/**remote server's dns name*/ char *dns_name;
/**remote server's forest name*/ char *forest_name;
/**remote server's domain guid*/ struct uuid *domain_guid;
/**remote server's domain SID*/ DOM_SID *domain_sid; } out; };
/** * Retrieves information about the LSA machine/domain * @param hnd initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param op input and output parameters * Note: for pre-Windows 2000 machines, only op->out.SID and op->out.domain will be set. @see cac_LsaFetchSid * @return - CAC_FAILURE if the operation was not successful. hnd->status will be set with an accurate NT_STATUS code * @return CAC_SUCCESS the operation was successful. */ int cac_LsaQueryInfoPolicy(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaQueryInfoPolicy *op);
struct LsaEnumSids { struct { /**Open LSA Policy handle*/ POLICY_HND *pol;
/**The prefered maximum number of SIDs returned per call*/ uint32 pref_max_sids; } in;
struct { /**used to keep track of how many sids have been retrieved over multiple calls * should be set to zero via ZERO_STRUCT() befrore the first call. Use the same struct LsaEnumSids for multiple calls*/ uint32 resume_idx;
/**The number of sids returned this call*/ uint32 num_sids;
/**Array of sids returned*/ DOM_SID *sids;
} out; };
/** * Enumerates the SIDs in the LSA. Can be enumerated in blocks by calling the function multiple times. * Example: while(cac_LsaEnumSids(hnd, mem_ctx, op) { ... } * @param hnd - An initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE there was an error during operations OR there are no more results * @return CAC_SUCCESS the operation completed and results were returned */ int cac_LsaEnumSids(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaEnumSids *op);
struct LsaEnumAccountRights { struct { /**Open LSA Policy handle*/ POLICY_HND *pol;
/**(Optional) SID of the account - must supply either sid or name*/ DOM_SID *sid;
/**(Optional) name of the account - must supply either sid or name*/ char *name; } in;
struct { /**Count of rights for this account*/ uint32 num_privs;
/**array of privilege names*/ char **priv_names; } out; };
/** * Enumerates rights assigned to a given account. Takes a SID instead of account handle as input * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE the rights could not be retrieved. hnd->status is set with NT_STATUS code * @return CAC_SUCCESS the operation was successful. */
int cac_LsaEnumAccountRights(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaEnumAccountRights *op);
struct LsaEnumTrustedDomains { struct { /**Open LSA policy handle*/ POLICY_HND *pol; } in;
struct { /**used to keep track of how many domains have been retrieved over multiple calls * should be set to zero via ZERO_STRUCT() before the first call. Use the same struct LsaEnumSids for multiple calls*/ uint32 resume_idx; /**The number of domains returned by the remote server this call*/ uint32 num_domains;
/**array of trusted domain names returned by the remote server*/ char **domain_names;
/**array of trusted domain sids returned by the remote server*/ DOM_SID *domain_sids; } out; }; /** * Enumerates the trusted domains in the LSA. * @param hnd - An initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param op - initialized parameters * @return CAC_FAILURE there was an error during operations OR there are no more results * @return CAC_SUCCESS the operation completed and results were returned */ int cac_LsaEnumTrustedDomains(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaEnumTrustedDomains *op);
struct LsaOpenTrustedDomain { struct { /**an open LSA policy handle*/ POLICY_HND *pol;
/**SID of the trusted domain to open*/ DOM_SID *domain_sid;
/**Desired access on the open domain*/ uint32 access; } in;
struct { /**A handle to the policy that is opened*/ POLICY_HND *domain_pol; } out; };
/** * Opens a trusted domain by SID. * @param hnd An initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param op initialized I/O parameters * @return CAC_FAILURE a handle to the domain could not be opened. hnd->status is set with approriate NT_STATUS code * @return CAC_SUCCESS the domain was opened successfully */ int cac_LsaOpenTrustedDomain(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaOpenTrustedDomain *op);
struct LsaQueryTrustedDomainInfo { struct { /**Open LSA policy handle*/ POLICY_HND *pol;
/**Info class of returned data*/ uint16 info_class;
/**(Optional)SID of trusted domain to query (must specify either SID or name of trusted domain)*/ DOM_SID *domain_sid;
/**(Optional)Name of trusted domain to query (must specify either SID or name of trusted domain)*/ char *domain_name; } in;
struct { /**information about the trusted domain*/ LSA_TRUSTED_DOMAIN_INFO *info; } out; };
/** * Retrieves information a trusted domain. * @param hnd An initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param op initialized I/O parameters * @return CAC_FAILURE a handle to the domain could not be opened. hnd->status is set with approriate NT_STATUS code * @return CAC_SUCCESS the domain was opened successfully */
int cac_LsaQueryTrustedDomainInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaQueryTrustedDomainInfo *op);
struct LsaEnumPrivileges { struct { /**An open LSA policy handle*/ POLICY_HND *pol;
/**The _preferred_ maxinum number of privileges returned per call*/ uint32 pref_max_privs; } in;
struct { /**Used to keep track of how many privileges have been retrieved over multiple calls. Do not modify this value between calls*/ uint32 resume_idx;
/**The number of privileges returned this call*/ uint32 num_privs;
/**Array of privilege names*/ char **priv_names;
/**Array of high bits for privilege LUID*/ uint32 *high_bits;
/**Array of low bits for privilege LUID*/ uint32 *low_bits; } out; };
/** * Enumerates the Privileges supported by the LSA. Can be enumerated in blocks by calling the function multiple times. * Example: while(cac_LsaEnumPrivileges(hnd, mem_ctx, op) { ... } * @param hnd An initialized and connected server handle * @param mem_ctx Talloc context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE there was an error during operations OR there are no more results * @return CAC_SUCCESS the operation completed and results were returned * @see CAC_OP_FAILED() */ int cac_LsaEnumPrivileges(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaEnumPrivileges *op);
struct LsaOpenAccount { struct { /**An open LSA policy handle*/ POLICY_HND *pol;
/**(Optional) account SID - must supply either sid or name*/ DOM_SID *sid;
/**(Optional) account name - must supply either sid or name*/ char *name;
/**desired access for the handle*/ uint32 access; } in;
struct { /**A handle to the opened user*/ POLICY_HND *user; } out; };
/** * Opens a handle to an account in the LSA * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE the account could not be opened. hnd->status has appropriate NT_STATUS code * @return CAC_SUCCESS the account was opened */ int cac_LsaOpenAccount(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaOpenAccount *op);
struct LsaAddPrivileges { struct { /**An open LSA policy handle*/ POLICY_HND *pol;
/**(Optional) The user's SID (must specify at least sid or name)*/ DOM_SID *sid;
/**(Optional) The user's name (must specify at least sid or name)*/ char *name;
/**The privilege names of the privileges to add for the account*/ char **priv_names; /**The number of privileges in the priv_names array*/ uint32 num_privs;
} in; };
/** * Adds Privileges an account. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE the privileges could not be set. hnd->status has appropriate NT_STATUS code * @return CAC_SUCCESS the privileges were set. */ int cac_LsaAddPrivileges(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaAddPrivileges *op);
struct LsaRemovePrivileges { struct { /**An open handle to the LSA*/ POLICY_HND *pol;
/**(Optional) The account SID (must specify at least sid or name)*/ DOM_SID *sid;
/**(Optional) The account name (must specify at least sid or name)*/ char *name;
/**The privilege names of the privileges to remove from the account*/ char **priv_names;
/**The number of privileges in the priv_names array*/ uint32 num_privs;
} in;
};
/** * Removes a _specific_ set of privileges from an account * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE the privileges could not be removed. hnd->status is set with NT_STATUS code * @return CAC_SUCCESS the privileges were removed */ int cac_LsaRemovePrivileges(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaRemovePrivileges *op);
struct LsaClearPrivileges { struct { /**An open handle to the LSA*/ POLICY_HND *pol;
/**(Optional) The user's SID (must specify at least sid or name)*/ DOM_SID *sid;
/**(Optional) The user's name (must specify at least sid or name)*/ char *name; } in;
};
/** * Removes ALL privileges from an account * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE the operation was not successful, hnd->status set with NT_STATUS code * @return CAC_SUCCESS the opeartion was successful. */ int cac_LsaClearPrivileges(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaClearPrivileges *op);
/** * Sets an accounts priviliges. Removes all privileges and then adds specified privileges. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE The operation could not complete successfully * @return CAC_SUCCESS The operation completed successfully */ int cac_LsaSetPrivileges(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaAddPrivileges *op);
struct LsaGetSecurityObject { struct { /**Open LSA policy handle*/ POLICY_HND *pol; } in;
struct { /**Returned security descriptor information*/ SEC_DESC_BUF *sec; } out; };
/** * Retrieves Security Descriptor information about the LSA * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE The operation could not complete successfully * @return CAC_SUCCESS The operation completed successfully */ int cac_LsaGetSecurityObject(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct LsaGetSecurityObject *op);
/**@}*/ /*LSA_Functions*/ /********************** * Registry Functions * *********************/
/**@addtogroup Reg_Functions * @{ */
struct RegConnect { struct { /** must be one of : * HKEY_CLASSES_ROOT, * HKEY_LOCAL_MACHINE, * HKEY_USERS, * HKEY_PERFORMANCE_DATA, */ int root;
/**desired access on the root key * combination of: * REG_KEY_READ, * REG_KEY_WRITE, * REG_KEY_EXECUTE, * REG_KEY_ALL, * found in include/rpc_secdes.h*/ uint32 access; } in;
struct { POLICY_HND *key; } out; };
/** * Opens a handle to the registry on the server * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_RegConnect(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegConnect *op);
/** * Closes an open registry handle * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param key The Key/Handle to close * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_RegClose(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *key);
struct RegOpenKey { struct { /**(Optional)parent key. * If this is NULL, then cac_RegOpenKey() will attempt to connect to the registry, name MUST start with something like:<br> * HKEY_LOCAL_MACHINE\ or an abbreviation like HKCR\ * * supported root names: * - HKEY_LOCAL_MACHINE\ or HKLM\ * - HKEY_CLASSES_ROOT\ or HKCR\ * - HKEY_USERS\ or HKU\ * - HKEY_PERFORMANCE_DATA or HKPD\ */ POLICY_HND *parent_key;
/**name/path of key*/ char *name;
/**desired access on this key*/ uint32 access; } in;
struct { POLICY_HND *key; } out; }; /** * Opens a registry key * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_RegOpenKey(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegOpenKey *op);
struct RegEnumKeys { struct { /**enumerate subkeys of this key*/ POLICY_HND *key;
/**maximum number of keys to enumerate each call*/ uint32 max_keys; } in;
struct { /**keeps track of the index to resume enumerating*/ uint32 resume_idx;
/**the number of keys returned this call*/ uint32 num_keys;
/**array of key names*/ char **key_names;
/**class names of the keys*/ char **class_names;
/**last modification time of the key*/ time_t *mod_times; } out; };
/** * Enumerates Subkeys of a given key. Can be run in a loop. Example: while(cac_RegEnumKeys(hnd, mem_ctx, op)) { ... } * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @see CAC_OP_FAILED() * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_RegEnumKeys(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegEnumKeys *op);
struct RegCreateKey { struct { /**create a subkey of parent_key*/ POLICY_HND *parent_key;
/**name of the key to create*/ char *key_name;
/**class of the key*/ char *class_name;
/**Access mask to open the key with. See REG_KEY_* in include/rpc_secdes.h*/ uint32 access; } in;
struct { /**Open handle to the key*/ POLICY_HND *key; } out; };
/** * Creates a registry key, if the key already exists, it will be opened __Creating keys is not currently working__. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parmeters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_RegCreateKey(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegCreateKey *op);
struct RegDeleteKey { struct { /**handle to open registry key*/ POLICY_HND *parent_key;
/**name of the key to delete*/ char *name;
/**delete recursively. WARNING: this might not always work as planned*/ BOOL recursive; } in;
};
/** * Deletes a subkey of an open key. Note: if you run this with op->in.recursive == True, and the operation fails, it may leave the key in an inconsistent state. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_RegDeleteKey(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegDeleteKey *op);
struct RegDeleteValue { struct { /**handle to open registry key*/ POLICY_HND *parent_key;
/**name of the value to delete*/ char *name; } in; };
/** * Deletes a registry value. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_RegDeleteValue(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegDeleteValue *op);
struct RegQueryKeyInfo { struct { /**Open handle to the key to query*/ POLICY_HND *key; } in;
struct { /**name of the key class*/ char *class_name;
/**number of subkeys of the key*/ uint32 num_subkeys;
/**length (in characters) of the longest subkey name*/ uint32 longest_subkey;
/**length (in characters) of the longest class name*/ uint32 longest_class;
/**number of values in this key*/ uint32 num_values;
/**length (in characters) of the longest value name*/ uint32 longest_value_name;
/**length (in bytes) of the biggest value data*/ uint32 longest_value_data;
/**size (in bytes) of the security descriptor*/ uint32 security_desc_size;
/**time of the last write*/ time_t last_write_time; } out; };
/** * Retrieves information about an open key * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_RegQueryKeyInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegQueryKeyInfo *op);
struct RegSaveKey { struct { /**Open key to be saved*/ POLICY_HND *key;
/**The path (on the remote computer) to save the file to*/ char *filename; } in; };
/** * Saves a key to a file on the remote machine __Not currently working__. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_RegSaveKey(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegSaveKey *op);
struct RegQueryValue { struct { /**handle to open registry key*/ POLICY_HND *key;
/**name of the value to query*/ char *val_name; } in;
struct { /**Value type. * One of: * - REG_DWORD (equivalent to REG_DWORD_LE) * - REG_DWORD_BE * - REG_SZ * - REG_EXPAND_SZ * - REG_MULTI_SZ * - REG_BINARY */ uint32 type;
/**The value*/ REG_VALUE_DATA *data; } out; };
/** * Retrieves a value (type and data) _not currently working_. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_RegQueryValue(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegQueryValue *op);
struct RegEnumValues { struct { /**handle to open key*/ POLICY_HND *key;
/**max number of values returned per call*/ uint32 max_values;
} in;
struct { /**keeps track of the index to resume from - used over multiple calls*/ uint32 resume_idx;
/**the number of values that were returned this call*/ uint32 num_values;
/**Array of value types. A type can be one of: * - REG_DWORD (equivalent to REG_DWORD_LE) * - REG_DWORD_BE * - REG_SZ * - REG_EXPAND_SZ * - REG_MULTI_SZ * - REG_BINARY */ uint32 *types;
/**array of strings storing the names of the values*/ char **value_names;
/**array of pointers to the value data returned*/ REG_VALUE_DATA **values; } out; };
/** * Enumerates a number of Registry values in an open registry key. * Can be run in a loop. Example: while(cac_RegEnumValues(hnd, mem_ctx, op)) { ... } * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @see CAC_OP_FAILED() * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_RegEnumValues(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegEnumValues *op);
struct RegSetValue { struct { /**Handle to open registry key*/ POLICY_HND *key;
/**Name of the value*/ char *val_name;
/**Value type. * One of: * - REG_DWORD (equivalent to REG_DWORD_LE) * - REG_DWORD_BE * - REG_SZ * - REG_EXPAND_SZ * - REG_MULTI_SZ * - REG_BINARY */ uint32 type;
/**the value*/ REG_VALUE_DATA value; } in; };
/** * Sets or creates value (type and data). * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_RegSetValue(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegSetValue *op);
struct RegGetVersion { struct { /**open registry key*/ POLICY_HND *key; } in;
struct { /**version number*/ uint32 version; } out; };
/** * Retrieves the registry version number * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_RegGetVersion(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegGetVersion *op);
struct RegGetKeySecurity { struct { /**Handle to key to query*/ POLICY_HND *key;
/**Info that you want. Should be a combination of (1 or more or'd): * - OWNER_SECURITY_INFORMATION * - GROUP_SECURITY_INFORMATION * - DACL_SECURITY_INFORMATION * - SACL_SECURITY_INFORMATION * - UNPROTECTED_SACL_SECURITY_INFORMATION * - UNPROTECTED_DACL_SECURITY_INFORMATION * - PROTECTED_SACL_SECURITY_INFORMATION * - PROTECTED_DACL_SECURITY_INFORMATION * * or use: * - ALL_SECURITY_INFORMATION * * all definitions from include/rpc_secdes.h */ uint32 info_type; } in;
struct { /**size of the data returned*/ uint32 size;
/**Security descriptor*/ SEC_DESC *descriptor; } out; };
/** * Retrieves a key security descriptor. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_RegGetKeySecurity(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegGetKeySecurity *op);
struct RegSetKeySecurity { struct { /**Handle to key to query*/ POLICY_HND *key;
/**Info that you want. Should be a combination of (1 or more or'd): * - OWNER_SECURITY_INFORMATION * - GROUP_SECURITY_INFORMATION * - DACL_SECURITY_INFORMATION * - SACL_SECURITY_INFORMATION * - UNPROTECTED_SACL_SECURITY_INFORMATION * - UNPROTECTED_DACL_SECURITY_INFORMATION * - PROTECTED_SACL_SECURITY_INFORMATION * - PROTECTED_DACL_SECURITY_INFORMATION * * or use: * - ALL_SECURITY_INFORMATION * * all definitions from include/rpc_secdes.h */ uint32 info_type; /**size of the descriptor*/ size_t size;
/**Security descriptor*/ SEC_DESC *descriptor; } in; };
/** * Sets the key security descriptor. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_RegSetKeySecurity(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct RegSetKeySecurity *op);
/**@}*/ /*Reg_Functions*/
struct Shutdown { struct { /**the message to display (can be NULL)*/ char *message;
/**timeout in seconds*/ uint32 timeout;
/**False = shutdown, True = reboot*/ BOOL reboot; /**force the*/ BOOL force;
/*FIXME: make this useful*/ uint32 reason; } in; };
/** * Shutdown the server _not currently working_. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_Shutdown(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct Shutdown *op);
/** * Attempt to abort initiated shutdown on the server _not currently working_. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_AbortShutdown(CacServerHandle *hnd, TALLOC_CTX *mem_ctx);
/***************** * SAM Functions * *****************/
/**@addtogroup SAM_Functions * @{ */ struct SamConnect { struct { /**Access mask to open with * see generic access masks in include/smb.h*/ uint32 access; } in;
struct { POLICY_HND *sam; } out; };
/** * Connects to the SAM. This can be skipped by just calling cac_SamOpenDomain() * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_SamConnect(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamConnect *op);
/** * Closes any (SAM, domain, user, group, etc.) SAM handle. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param sam Handle to close * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_SamClose(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *sam);
struct SamOpenDomain { struct { /**The desired access. See generic access masks - include/smb.h*/ uint32 access;
/**(Optional) An open handle to the SAM. If it is NULL, the function will connect to the SAM with the access mask above*/ POLICY_HND *sam;
/**(Optional) The SID of the domain to open. * If this this is NULL, the function will attempt to open the domain specified in hnd->domain */ DOM_SID *sid; } in;
struct { /**handle to the open domain*/ POLICY_HND *dom_hnd;
/**Handle to the open SAM*/ POLICY_HND *sam; } out; };
/** * Opens a handle to a domain. This must be called before any other SAM functions * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamOpenDomain(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamOpenDomain *op);
struct SamCreateUser { struct { /**Open domain handle*/ POLICY_HND *dom_hnd;
/**Username*/ char *name;
/**See Allowable account control bits in include/smb.h*/ uint32 acb_mask; } in;
struct { /**handle to the user*/ POLICY_HND *user_hnd;
/**rid of the user*/ uint32 rid; } out; };
/** * Creates a new domain user, if the account already exists it will _not_ be opened and hnd->status will be NT_STATUS_USER_EXISTS * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_SamCreateUser(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamCreateUser *op);
struct SamOpenUser { struct { /**Handle to open SAM connection*/ POLICY_HND *dom_hnd;
/**desired access - see generic access masks in include/smb.h*/ uint32 access;
/**RID of the user*/ uint32 rid;
/**(Optional) name of the user - must supply either RID or user name*/ char *name; } in;
struct { /**Handle to the user*/ POLICY_HND *user_hnd; } out; };
/** * Opens a domain user. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamOpenUser(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamOpenUser *op);
/** * Deletes a domain user. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param user_hnd Open handle to the user * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamDeleteUser(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *user_hnd);
struct SamEnumUsers { struct { /**Open handle to a domain*/ POLICY_HND *dom_hnd;
/**Enumerate users with specific ACB. If 0, all users will be enumerated*/ uint32 acb_mask; } in;
struct { /**where to resume from. Used over multiple calls*/ uint32 resume_idx;
/**the number of users returned this call*/ uint32 num_users;
/**Array storing the rids of the returned users*/ uint32 *rids;
/**Array storing the names of all the users returned*/ char **names;
BOOL done; } out; };
/** * Enumerates domain users. Can be used as a loop condition. Example: while(cac_SamEnumUsers(hnd, mem_ctx, op)) { ... } * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamEnumUsers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamEnumUsers *op);
struct SamGetNamesFromRids { struct { /**An open handle to the domain SAM from cac_SamOpenDomain()*/ POLICY_HND *dom_hnd;
/**Number of RIDs to resolve*/ uint32 num_rids;
/**Array of RIDs to resolve*/ uint32 *rids; } in;
struct { /**the number of names returned - if this is 0, the map is NULL*/ uint32 num_names;
/**array contiaing the Names and RIDs*/ CacLookupRidsRecord *map; } out; };
/** * Returns a list of names which map to a list of RIDs. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamGetNamesFromRids(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetNamesFromRids *op);
struct SamGetRidsFromNames { struct { /**An open handle to the domain SAM from cac_SamOpenDomain()*/ POLICY_HND *dom_hnd;
/**Number of names to resolve*/ uint32 num_names;
/**Array of names to resolve*/ char **names; } in;
struct { /**the number of names returned - if this is 0, then map is NULL*/ uint32 num_rids;
/**array contiaing the Names and RIDs*/ CacLookupRidsRecord *map; } out; };
/** * Returns a list of RIDs which map to a list of names. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamGetRidsFromNames(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetRidsFromNames *op);
struct SamGetGroupsForUser { struct { /**An open handle to the user*/ POLICY_HND *user_hnd; } in;
struct { /**The number of groups the user is a member of*/ uint32 num_groups;
/**The RIDs of the groups*/ uint32 *rids;
/**The attributes of the groups*/ uint32 *attributes; } out; }; /** * Retrieves a list of groups that a user is a member of. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamGetGroupsForUser(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetGroupsForUser *op);
struct SamOpenGroup { struct { /**Open handle to the domain SAM*/ POLICY_HND *dom_hnd;
/**Desired access to open the group with. See Generic access masks in include/smb.h*/ uint32 access;
/**rid of the group*/ uint32 rid; } in;
struct { /**Handle to the group*/ POLICY_HND *group_hnd; } out; };
/** * Opens a domain group. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamOpenGroup(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamOpenGroup *op);
struct SamCreateGroup { struct { /**Open handle to the domain SAM*/ POLICY_HND *dom_hnd;
/**Desired access to open the group with. See Generic access masks in include/smb.h*/ uint32 access;
/**The name of the group*/ char *name; } in;
struct { /**Handle to the group*/ POLICY_HND *group_hnd; } out; };
/** * Creates a group. If the group already exists it will not be opened. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamCreateGroup(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamCreateGroup *op);
/** * Deletes a domain group. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param group_hnd Open handle to the group. * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamDeleteGroup(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *group_hnd);
struct SamGetGroupMembers { struct { /**Open handle to a group*/ POLICY_HND *group_hnd; } in;
struct { /**The number of members in the group*/ uint32 num_members;
/**An array storing the RIDs of the users*/ uint32 *rids;
/**The attributes*/ uint32 *attributes; } out; };
/** * Retrives a list of users in a group. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamGetGroupMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetGroupMembers *op);
struct SamAddGroupMember { struct { /**Open handle to a group*/ POLICY_HND *group_hnd;
/**RID of new member*/ uint32 rid; } in; };
/** * Adds a user to a group. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamAddGroupMember(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamAddGroupMember *op);
struct SamRemoveGroupMember { struct { /**Open handle to a group*/ POLICY_HND *group_hnd;
/**RID of member to remove*/ uint32 rid; } in; };
/** * Removes a user from a group. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamRemoveGroupMember(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamRemoveGroupMember *op);
/** * Removes all the members of a group - warning: if this function fails is is possible that some but not all members were removed * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param group_hnd Open handle to the group to clear * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamClearGroupMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *group_hnd);
struct SamSetGroupMembers { struct { /**Open handle to the group*/ POLICY_HND *group_hnd;
/**Number of members in the group - if this is 0, all members of the group will be removed*/ uint32 num_members;
/**The RIDs of the users to add*/ uint32 *rids; } in; };
/** * Clears the members of a group and adds a list of members to the group * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamSetGroupMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetGroupMembers *op);
struct SamEnumGroups { struct { /**Open handle to a domain*/ POLICY_HND *dom_hnd; } in;
struct { /**Where to resume from _do not_ modify this value. Used over multiple calls.*/ uint32 resume_idx;
/**the number of users returned this call*/ uint32 num_groups;
/**Array storing the rids of the returned groups*/ uint32 *rids;
/**Array storing the names of all the groups returned*/ char **names;
/**Array storing the descriptions of all the groups returned*/ char **descriptions;
BOOL done; } out; };
/** * Enumerates domain groups. Can be used as a loop condition. Example: while(cac_SamEnumGroups(hnd, mem_ctx, op)) { ... } * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamEnumGroups(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamEnumGroups *op);
struct SamEnumAliases { struct { /**Open handle to a domain*/ POLICY_HND *dom_hnd; } in;
struct { /**where to resume from. Used over multiple calls*/ uint32 resume_idx;
/**the number of users returned this call*/ uint32 num_aliases;
/**Array storing the rids of the returned groups*/ uint32 *rids;
/**Array storing the names of all the groups returned*/ char **names;
/**Array storing the descriptions of all the groups returned*/ char **descriptions;
BOOL done; } out; };
/** * Enumerates domain aliases. Can be used as a loop condition. Example: while(cac_SamEnumAliases(hnd, mem_ctx, op)) { ... } * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamEnumAliases(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamEnumAliases *op);
struct SamCreateAlias { struct { /**Open handle to the domain SAM*/ POLICY_HND *dom_hnd;
/**The name of the alias*/ char *name; } in;
struct { /**Handle to the group*/ POLICY_HND *alias_hnd; } out; };
/** * Creates an alias. If the alias already exists it will not be opened. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_SamCreateAlias(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamCreateAlias *op);
struct SamOpenAlias { struct { /**Open handle to the domain SAM*/ POLICY_HND *dom_hnd;
/**Desired access to open the group with. See Generic access masks in include/smb.h*/ uint32 access;
/**rid of the alias*/ uint32 rid; } in;
struct { /**Handle to the alias*/ POLICY_HND *alias_hnd; } out; };
/** * Opens a handle to an alias. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamOpenAlias(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamOpenAlias *op);
/** * Deletes an alias. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param alias_hnd Open handle to the alias * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamDeleteAlias(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *alias_hnd);
struct SamAddAliasMember { struct { /**Open handle to a alias*/ POLICY_HND *alias_hnd;
/**SID of new member*/ DOM_SID *sid; } in; };
/** * Adds an account to an alias. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamAddAliasMember(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamAddAliasMember *op);
struct SamRemoveAliasMember { struct { /**Open handle to the alias*/ POLICY_HND *alias_hnd;
/**The SID of the member*/ DOM_SID *sid; } in; };
/** * Removes an account from an alias. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamRemoveAliasMember(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamRemoveAliasMember *op);
struct SamGetAliasMembers { struct { /**Open handle to the alias*/ POLICY_HND *alias_hnd; } in;
struct { /**The number of members*/ uint32 num_members;
/**An array storing the SIDs of the accounts*/ DOM_SID *sids; } out; };
/** * Retrieves a list of all accounts in an alias. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamGetAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetAliasMembers *op);
/** * Removes all the members of an alias - warning: if this function fails is is possible that some but not all members were removed * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param alias_hnd Handle to the alias to clear * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_SamClearAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *alias_hnd);
struct SamSetAliasMembers { struct { /**Open handle to the group*/ POLICY_HND *alias_hnd;
/**Number of members in the group - if this is 0, all members of the group will be removed*/ uint32 num_members;
/**The SIDs of the accounts to add*/ DOM_SID *sids; } in; };
/** * Clears the members of an alias and adds a list of members to the alias * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamSetAliasMembers(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetAliasMembers *op);
struct SamUserChangePasswd { struct { /**The username*/ char *username;
/**The current password*/ char *password;
/**The new password*/ char *new_password; } in; }; /**Used by a user to change their password*/ int cac_SamUserChangePasswd(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamUserChangePasswd *op);
/** * Enables a user * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param user_hnd Open handle to the user to enable * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamEnableUser(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *user_hnd);
/** * Disables a user * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param user_hnd Open handle to the user to disables * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamDisableUser(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *user_hnd);
struct SamSetPassword { struct { /**Open handle to a user*/ POLICY_HND *user_hnd;
/**The new password*/ char *password; } in; };
/** * Sets a user's password * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_SamSetPassword(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetPassword *op);
struct SamGetUserInfo { struct { /**Open Handle to a user*/ POLICY_HND *user_hnd; } in;
struct { CacUserInfo *info; } out; };
/** * Retrieves user information using a CacUserInfo structure. If you would like to use a SAM_USERINFO_CTR directly, use cac_SamGetUserInfoCtr() * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @see cac_SamGetUserInfoCtr() * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamGetUserInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetUserInfo *op);
struct SamSetUserInfo { struct { /**Open handle to a user*/ POLICY_HND *user_hnd;
/**Structure containing the data you would like to set*/ CacUserInfo *info; } in; };
/** * Sets the user info using a CacUserInfo structure. If you would like to use a SAM_USERINFO_CTR directly use cac_SamSetUserInfoCtr(). * @note All fields in the CacUserInfo structure will be set. Best to call cac_GetUserInfo() modify fields that you want, and then call cac_SetUserInfo(). * @note When calling this, you _must_ set the user's password. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @see cac_SamSetUserInfoCtr() * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamSetUserInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetUserInfo *op);
struct SamGetUserInfoCtr { struct { /**Open handle to a user*/ POLICY_HND *user_hnd;
/**What USER_INFO structure you want. See include/rpc_samr.h*/ uint16 info_class; } in;
struct { /**returned user info*/ SAM_USERINFO_CTR *ctr; } out; };
/** * Retrieves user information using a SAM_USERINFO_CTR structure. If you don't want to use this structure, user SamGetUserInfo() * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @see cac_SamGetUserInfo() * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamGetUserInfoCtr(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetUserInfoCtr *op);
struct SamSetUserInfoCtr { struct { /**Open handle to a user*/ POLICY_HND *user_hnd;
/**user info - make sure ctr->switch_value is set properly*/ SAM_USERINFO_CTR *ctr; } in; };
/** * Sets the user info using a SAM_USERINFO_CTR structure. If you don't want to use this structure, use cac_SamSetUserInfo() * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @see cac_SamSetUserInfo() * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_SamSetUserInfoCtr(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetUserInfoCtr *op);
struct SamRenameUser { struct { /**Open handle to user*/ POLICY_HND *user_hnd;
/**New user name*/ char *new_name; } in; };
/** * Changes the name of a user. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamRenameUser(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamRenameUser *op);
struct SamGetGroupInfo { struct { /**Open handle to a group*/ POLICY_HND *group_hnd; } in;
struct { /**Returned info about the group*/ CacGroupInfo *info; } out; };
/** * Retrieves information about a group. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamGetGroupInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetGroupInfo *op);
struct SamSetGroupInfo { struct { /**Open handle to a group*/ POLICY_HND *group_hnd;
/**group info*/ CacGroupInfo *info; } in; };
/** * Sets information about a group. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamSetGroupInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetGroupInfo *op);
struct SamRenameGroup { struct { /**Open handle to a group*/ POLICY_HND *group_hnd;
/**New name*/ char *new_name; } in; };
/** * Changes the name of a group * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */
int cac_SamRenameGroup(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamRenameGroup *op);
struct SamGetAliasInfo { struct { /**Open handle to an alias*/ POLICY_HND *alias_hnd; } in;
struct { /**Returned alias info*/ CacAliasInfo *info; } out; };
/** * Retrieves information about an alias. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamGetAliasInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetAliasInfo *op);
struct SamSetAliasInfo { struct { /**Open handle to an alias*/ POLICY_HND *alias_hnd; /**Returned alias info*/ CacAliasInfo *info; } in; };
/** * Sets information about an alias. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE The operation could not complete successfully. hnd->status is set with appropriate NTSTATUS code * @return CAC_SUCCESS The operation completed successfully */ int cac_SamSetAliasInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamSetAliasInfo *op);
struct SamGetDomainInfo { struct { /**Open handle to the domain SAM*/ POLICY_HND *dom_hnd; } in;
struct { /**Returned domain info*/ CacDomainInfo *info; } out; };
/** * Gets domain information in the form of a CacDomainInfo structure. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @see SamGetDomainInfoCtr() * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful * @return CAC_PARTIAL_SUCCESS - This function makes 3 rpc calls, if one or two fail and the rest succeed, * not all fields in the CacDomainInfo structure will be filled */ int cac_SamGetDomainInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetDomainInfo *op);
struct SamGetDomainInfoCtr { struct { /**Open handle to domain*/ POLICY_HND *dom_hnd;
/**What info level you want*/ uint16 info_class; } in;
struct { SAM_UNK_CTR *info; } out; };
/** * Gets domain information in the form of a SAM_UNK_CTR structure. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @see SamGetDomainInfo() * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SamGetDomainInfoCtr(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetDomainInfoCtr *op);
struct SamGetDisplayInfo { struct { /**Open handle to domain*/ POLICY_HND *dom_hnd;
/**What type of data*/ uint16 info_class;
/**(Optional)If 0, max_entries and max_size will be filled in by the function*/ uint32 max_entries; /**(Optional)If 0, max_entries and max_size will be filled in by the function*/ uint32 max_size; } in;
struct { /**Do not modify this value, use the same value between multiple calls (ie in while loop)*/ uint32 resume_idx;
/**Number of entries returned*/ uint32 num_entries;
/**Returned display info*/ SAM_DISPINFO_CTR ctr;
/**Internal value. Do not modify.*/ uint32 loop_count;
BOOL done; } out; };
/** * Gets dislpay information using a SAM_DISPINFO_CTR. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SamGetDisplayInfo(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetDisplayInfo *op);
struct SamLookupDomain { struct { /**Open handle to the sam (opened with cac_SamConnect() or cac_SamOpenDomain()*/ POLICY_HND *sam;
/**Name of the domain to lookup*/ char *name; } in;
struct { /**SID of the domain*/ DOM_SID *sid; } out; };
/** * Looks up a Domain SID given it's name. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SamLookupDomain(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamLookupDomain *op);
struct SamGetSecurityObject { struct { /**An open handle (SAM, domain or user)*/ POLICY_HND *pol; } in;
struct { SEC_DESC_BUF *sec; } out; };
/** * Retrievies Security descriptor information for a SAM/Domain/user * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SamGetSecurityObject(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamGetSecurityObject *op);
struct SamFlush { struct { /**Open handle to the domain SAM*/ POLICY_HND *dom_hnd;
/**(Optional)Domain SID. If NULL, the domain in hnd->domain will be opened*/ DOM_SID *sid;
/**(Optional)Desired access to re-open the domain with. If 0, MAXIMUM_ALLOWED_ACCESS is used.*/ uint32 access; } in; };
/** * Closes the domain handle, then re-opens it - effectively flushing any changes made. * WARNING: if this fails you will no longer have an open handle to the domain SAM. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SamFlush(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SamFlush *op);
/**@}*/ /*SAM_Functions*/
/**@addtogroup SCM_Functions * @{ */
struct SvcOpenScm { struct { /**Desired access to open the Handle with. See SC_RIGHT_MGR_* or SC_MANAGER_* in include/rpc_secdes.h*/ uint32 access; } in;
struct { /**Handle to the SCM*/ POLICY_HND *scm_hnd; } out; };
/** * Opens a handle to the SCM on the remote machine. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SvcOpenScm(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcOpenScm *op);
/** * Closes an Svc handle (SCM or Service) * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param scm_hnd The handle to close * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SvcClose(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, POLICY_HND *scm_hnd);
struct SvcEnumServices { struct { /**Open handle to the SCM*/ POLICY_HND *scm_hnd;
/**(Optional)Type of service to enumerate. Possible values: * - SVCCTL_TYPE_WIN32 * - SVCCTL_TYPE_DRIVER * If this is 0, (SVCCTL_TYPE_DRIVER | SVCCTL_TYPE_WIN32) is assumed. */ uint32 type;
/**(Optional)State of service to enumerate. Possible values: * - SVCCTL_STATE_ACTIVE * - SVCCTL_STATE_INACTIVE * - SVCCTL_STATE_ALL * If this is 0, SVCCTL_STATE_ALL is assumed. */ uint32 state; } in; struct { /**Number of services returned*/ uint32 num_services;
/**Array of service structures*/ CacService *services; } out; };
/** * Enumerates services on the remote machine. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SvcEnumServices(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcEnumServices *op);
struct SvcOpenService { struct { /**Handle to the Service Control Manager*/ POLICY_HND *scm_hnd;
/**Access mask to open service with see SERVICE_* or SC_RIGHT_SVC_* in include/rpc_secdes.h*/ uint32 access;
/**The name of the service. _not_ the display name*/ char *name; } in;
struct { /**Handle to the open service*/ POLICY_HND *svc_hnd; } out; };
/** * Opens a handle to a service. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */
int cac_SvcOpenService(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcOpenService *op);
struct SvcGetStatus { struct { /**Open handle to the service to query*/ POLICY_HND *svc_hnd; } in;
struct { /**The status of the service. See include/rpc_svcctl.h for SERVICE_STATUS definition.*/ SERVICE_STATUS status; } out; };
/** * Retrieves the status of a service. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SvcGetStatus(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcGetStatus *op);
struct SvcStartService { struct { /**open handle to the service*/ POLICY_HND *svc_hnd;
/**Array of parameters to start the service with. Can be NULL if num_parms is 0*/ char **parms;
/**Number of parameters in the parms array*/ uint32 num_parms;
/**Number of seconds to wait for the service to actually start. If this is 0, then the status will not be checked after the initial call*/ uint32 timeout; } in; };
/** * Attempts to start a service. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */
int cac_SvcStartService(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcStartService *op);
struct SvcControlService { struct { /**Open handle to the service to control*/ POLICY_HND *svc_hnd;
/**The control operation to perform. Possible values (from include/rpc_svcctl.h): * - SVCCTL_CONTROL_STOP * - SVCCTL_CONTROL_PAUSE * - SVCCTL_CONTROL_CONTINUE * - SVCCTL_CONTROL_SHUTDOWN */ uint32 control; } in;
struct { /**The returned status of the service, _immediately_ after the call*/ SERVICE_STATUS *status; } out; };
/** * Performs a control operation on a service and _immediately_ returns. * @see cac_SvcStopService() * @see cac_SvcPauseService() * @see cac_SvcContinueService() * @see cac_SvcShutdownService() * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SvcControlService(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcControlService *op);
struct SvcStopService { struct { /**Open handle to the service*/ POLICY_HND *svc_hnd;
/**Number of seconds to wait for the service to actually start. * If this is 0, then the status will not be checked after the initial call and CAC_SUCCESS might be returned if the status isn't actually started */ uint32 timeout; } in;
struct { /**Status of the service after the operation*/ SERVICE_STATUS status; } out; };
/** * Attempts to stop a service. * @see cacSvcControlService() * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful. If hnd->status is NT_STATUS_OK, then a timeout occured. * @return CAC_SUCCESS - the operation was successful */ int cac_SvcStopService(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcStopService *op);
struct SvcPauseService { struct { /**Open handle to the service*/ POLICY_HND *svc_hnd;
/**Number of seconds to wait for the service to actually start. * If this is 0, then the status will not be checked after the initial call and CAC_SUCCESS might be returned if the status isn't actually started */ uint32 timeout; } in;
struct { /**Status of the service after the operation*/ SERVICE_STATUS status; } out; };
/** * Attempts to pause a service. * @see cacSvcControlService() * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful. If hnd->status is NT_STATUS_OK, then a timeout occured. * @return CAC_SUCCESS - the operation was successful */ int cac_SvcPauseService(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcPauseService *op);
struct SvcContinueService { struct { /**Open handle to the service*/ POLICY_HND *svc_hnd;
/**Number of seconds to wait for the service to actually start. * If this is 0, then the status will not be checked after the initial call and CAC_SUCCESS might be returned if the status isn't actually started */ uint32 timeout; } in;
struct { /**Status of the service after the operation*/ SERVICE_STATUS status; } out; };
/** * Attempts to continue a paused service. * @see cacSvcControlService() * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful. If hnd->status is NT_STATUS_OK, then a timeout occured. * @return CAC_SUCCESS - the operation was successful */ int cac_SvcContinueService(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcContinueService *op);
struct SvcGetDisplayName { struct { /**Open handle to the service*/ POLICY_HND *svc_hnd; } in;
struct { /**The returned display name of the service*/ char *display_name; } out; };
/** * Retrieves the display name of a service _not currently working_ * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SvcGetDisplayName(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcGetDisplayName *op);
struct SvcGetServiceConfig { struct { /**Open handle to the service*/ POLICY_HND *svc_hnd; } in;
struct { /**Returned Configuration information*/ CacServiceConfig config; } out; };
/** * Retrieves configuration information about a service. * @param hnd Initialized and connected server handle * @param mem_ctx Context for memory allocation * @param op Initialized Parameters * @return CAC_FAILURE - the operation was not successful hnd->status is set appropriately * @return CAC_SUCCESS - the operation was successful */ int cac_SvcGetServiceConfig(CacServerHandle *hnd, TALLOC_CTX *mem_ctx, struct SvcGetServiceConfig *op);
/**@}*/ /*SCM_Functions*/
struct rpc_pipe_client *cac_GetPipe(CacServerHandle *hnd, int pi_idx);
#endif /* LIBMSRPC_H */
|