/* * sam_delete_account * * Attempt to remove an account from the SAM database on the specified * server. * * Returns NT status codes. */ DWORD sam_delete_account(char *server, char *domain_name, char *account_name) { mlsvc_handle_t samr_handle; mlsvc_handle_t domain_handle; mlsvc_handle_t user_handle; smb_account_t ainfo; smb_sid_t *sid; DWORD access_mask; DWORD status; int rc; char user[SMB_USERNAME_MAXLEN]; smb_ipc_get_user(user, SMB_USERNAME_MAXLEN); rc = samr_open(server, domain_name, user, SAM_LOOKUP_INFORMATION, &samr_handle); if (rc != 0) return (NT_STATUS_CANT_ACCESS_DOMAIN_INFO); sid = samr_lookup_domain(&samr_handle, domain_name); if (sid == NULL) { status = NT_STATUS_CANT_ACCESS_DOMAIN_INFO; goto out_samr_hdl; } status = samr_open_domain(&samr_handle, SAM_LOOKUP_INFORMATION, (struct samr_sid *)sid, &domain_handle); if (status != NT_STATUS_SUCCESS) goto out_sid_ptr; status = samr_lookup_domain_names(&domain_handle, account_name, &ainfo); if (status != NT_STATUS_SUCCESS) goto out_dom_hdl; access_mask = STANDARD_RIGHTS_EXECUTE | DELETE; status = samr_open_user(&domain_handle, access_mask, ainfo.a_rid, &user_handle); if (status != NT_STATUS_SUCCESS) goto out_dom_hdl; status = samr_delete_user(&user_handle); (void) samr_close_handle(&user_handle); out_dom_hdl: (void) samr_close_handle(&domain_handle); out_sid_ptr: free(sid); out_samr_hdl: (void) samr_close_handle(&samr_handle); return (status); }
/* * sam_lookup_name * * Lookup an account name in the SAM database on the specified domain * controller. Provides the account RID on success. * * Returns NT status codes. */ DWORD sam_lookup_name(char *server, char *domain_name, char *account_name, DWORD *rid_ret) { mlsvc_handle_t samr_handle; mlsvc_handle_t domain_handle; smb_account_t ainfo; struct samr_sid *domain_sid; int rc; DWORD status; char user[SMB_USERNAME_MAXLEN]; smb_ipc_get_user(user, SMB_USERNAME_MAXLEN); *rid_ret = 0; rc = samr_open(server, domain_name, user, SAM_LOOKUP_INFORMATION, &samr_handle); if (rc != 0) return (NT_STATUS_OPEN_FAILED); domain_sid = (struct samr_sid *)samr_lookup_domain(&samr_handle, domain_name); if (domain_sid == NULL) { (void) samr_close_handle(&samr_handle); return (NT_STATUS_NO_SUCH_DOMAIN); } status = samr_open_domain(&samr_handle, SAM_LOOKUP_INFORMATION, domain_sid, &domain_handle); if (status == NT_STATUS_SUCCESS) { status = samr_lookup_domain_names(&domain_handle, account_name, &ainfo); if (status == NT_STATUS_SUCCESS) *rid_ret = ainfo.a_rid; (void) samr_close_handle(&domain_handle); } (void) samr_close_handle(&samr_handle); return (status); }
static struct samr_sid * sam_get_domain_sid(mlsvc_handle_t *samr_handle, char *server, char *domain_name) { smb_sid_t *sid = NULL; smb_domainex_t domain; if (ndr_rpc_server_os(samr_handle) == NATIVE_OS_WIN2000) { if (!smb_domain_getinfo(&domain)) { if (lsa_query_account_domain_info(server, domain_name, &domain.d_primary) != NT_STATUS_SUCCESS) return (NULL); } sid = smb_sid_fromstr(domain.d_primary.di_sid); } else { sid = samr_lookup_domain(samr_handle, domain_name); } return ((struct samr_sid *)sid); }