bool UserUtilities::ChangeAccountInfo(Account* account) { USER_INFO_2 *userInfo = new USER_INFO_2(); DWORD error = 0; DWORD level; DWORD res; int getRes = NetUserGetInfo(NULL, account->m_StrUserName, 2, (LPBYTE*)&userInfo); if(getRes != 0) { return false; } else { userInfo->usri2_full_name = account->m_StrFullName.GetBuffer(); userInfo->usri2_password = account->m_StrPassword.GetBuffer(); userInfo->usri2_comment = account->m_StrDescription.GetBuffer(); res = NetUserSetInfo(NULL, account->m_StrUserName, 2, (LPBYTE)userInfo, &error); if(res == 0) { return true; } else { return false; } } return true; }
/*! @brief ユーザフルネームの取得 (Unicode) */ BOOL CUserInfoDlg::GetFullNameW(wchar_t *UserName, wchar_t *, wchar_t *dest) { LPBYTE ComputerName = 0; struct _USER_INFO_2 *ui; // User structure BOOL bFoundDC = TRUE; DWORD nRet = NetGetDCName(NULL, NULL, &ComputerName ); // Get the computer name of a DC for the specified domain. if (nRet != NERR_Success) { printf("Error getting user information.\n" ); bFoundDC = FALSE; } // Look up the user on the DC. nRet = NetUserGetInfo((LPWSTR) ComputerName, (LPWSTR) UserName, 2, (LPBYTE *) &ui); if (nRet != NERR_Success) { if (bFoundDC == TRUE) { NetApiBufferFree(ComputerName); } printf("Error getting user information.\n" ); return(FALSE ); } if (bFoundDC == TRUE) { NetApiBufferFree(ComputerName); } wcsncpy_s(dest, 256, ui->usri2_full_name, _TRUNCATE); return(TRUE ); }
/** * Lookup a user based on a user ID. Calling functions should * free the result with authz_free_buffer(). * * @param userid user name to lookup * * @return a user info structure or NULL on error */ userinfo_t *authz_lookup_user(const char *userid) { struct USER_INFO_23 *buf = NULL; userinfo_t *result = NULL; NET_API_STATUS status; pthread_mutex_lock(&_ctxmtx); if (!userid || !_netapictx) { pthread_mutex_unlock(&_ctxmtx); return NULL; } status = NetUserGetInfo(_host, userid, 23, (uint8_t **)&buf); if (status != NET_API_STATUS_SUCCESS) { log_warn("NetApi lookup for user %s failed (%d)", userid, status); pthread_mutex_unlock(&_ctxmtx); return NULL; } result = (userinfo_t *)malloc(sizeof(userinfo_t)); bzero(result, sizeof(userinfo_t)); result->logon_name = strdup(userid); result->display_name = strdup(buf->usri23_full_name); ConvertSidToStringSid(buf->usri23_user_sid, &result->sid); NetApiBufferFree(buf); pthread_mutex_unlock(&_ctxmtx); log_debug("found user %s with SID %s", userid, result->sid); return result; }
NET_API_STATUS NetUserGetProfilePath( LPCWSTR Domain, LPCWSTR UserName, char * profilePath, DWORD profilePathLen ) { NET_API_STATUS code; LPWSTR ServerName = NULL; LPUSER_INFO_3 p3 = NULL; NetGetAnyDCName(NULL, Domain, (LPBYTE *)&ServerName); /* if NetGetAnyDCName fails, ServerName == NULL * NetUserGetInfo will obtain local user information */ code = NetUserGetInfo(ServerName, UserName, 3, (LPBYTE *)&p3); if (code == NERR_Success) { code = NERR_UserNotFound; if (p3) { if (p3->usri3_profile) { DWORD len = lstrlenW(p3->usri3_profile); if (len > 0) { /* Convert From Unicode to ANSI (UTF-8 for future) */ len = len < profilePathLen ? len : profilePathLen - 1; WideCharToMultiByte(CP_UTF8, 0, p3->usri3_profile, len, profilePath, len, NULL, NULL); profilePath[len] = '\0'; code = NERR_Success; } } NetApiBufferFree(p3); } } if (ServerName) NetApiBufferFree(ServerName); return code; }
enum System::userlevel System::userPermissions(void) { LPUSER_INFO_1 buf = NULL; wchar_t userbuf[UNLEN]; DWORD usersize = UNLEN; BOOL status; enum userlevel result = ERR; status = GetUserNameW(userbuf, &usersize); if(!status) return ERR; if(NetUserGetInfo(NULL, userbuf, (DWORD)1, (LPBYTE*)&buf) == NERR_Success) { switch(buf->usri1_priv) { case USER_PRIV_GUEST: result = GUEST; break; case USER_PRIV_USER: result = USER; break; case USER_PRIV_ADMIN: result = ADMIN; break; default: result = ERR; break; } } if(buf != NULL) NetApiBufferFree(buf); return result; }
static BOOL SetUserGeneralData(HWND hwndDlg, PGENERAL_USER_DATA pUserData) { PUSER_INFO_3 pUserInfo = NULL; LPTSTR pszFullName = NULL; LPTSTR pszComment = NULL; NET_API_STATUS status; DWORD dwIndex; INT nLength; NetUserGetInfo(NULL, pUserData->szUserName, 3, (LPBYTE*)&pUserInfo); pUserInfo->usri3_flags = (pUserData->dwFlags & VALID_GENERAL_FLAGS) | (pUserInfo->usri3_flags & ~VALID_GENERAL_FLAGS); pUserInfo->usri3_password_expired = pUserData->dwPasswordExpired; nLength = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_USER_GENERAL_FULL_NAME)); if (nLength == 0) { pUserInfo->usri3_full_name = NULL; } else { pszFullName = HeapAlloc(GetProcessHeap(), 0, (nLength + 1) * sizeof(TCHAR)); GetDlgItemText(hwndDlg, IDC_USER_GENERAL_FULL_NAME, pszFullName, nLength + 1); pUserInfo->usri3_full_name = pszFullName; } nLength = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_USER_GENERAL_DESCRIPTION)); if (nLength == 0) { pUserInfo->usri3_full_name = NULL; } else { pszComment = HeapAlloc(GetProcessHeap(), 0, (nLength + 1) * sizeof(TCHAR)); GetDlgItemText(hwndDlg, IDC_USER_GENERAL_DESCRIPTION, pszComment, nLength + 1); pUserInfo->usri3_comment = pszComment; } status = NetUserSetInfo(NULL, pUserData->szUserName, 3, (LPBYTE)pUserInfo, &dwIndex); if (status != NERR_Success) { DebugPrintf(_T("Status: %lu Index: %lu"), status, dwIndex); } if (pszFullName) HeapFree(GetProcessHeap(), 0, pszFullName); if (pszComment) HeapFree(GetProcessHeap(), 0, pszComment); NetApiBufferFree(pUserInfo); return (status == NERR_Success); }
APIERR MNetUserGetInfo( const TCHAR FAR * pszServer, TCHAR FAR * pszUserName, UINT Level, BYTE FAR ** ppbBuffer ) { return (APIERR)NetUserGetInfo( (TCHAR *)pszServer, pszUserName, Level, ppbBuffer ); } // MNetUserGetInfo
NS_IMETHODIMP nsUserInfo::GetFullname(PRUnichar **aFullname) { NS_ENSURE_ARG_POINTER(aFullname); *aFullname = nullptr; PRUnichar fullName[512]; DWORD size = mozilla::ArrayLength(fullName); if (GetUserNameExW(NameDisplay, fullName, &size)) { *aFullname = ToNewUnicode(nsDependentString(fullName)); } else { DWORD getUsernameError = GetLastError(); // Try to use the net APIs regardless of the error because it may be // able to obtain the information. PRUnichar username[UNLEN + 1]; size = mozilla::ArrayLength(username); if (!GetUserNameW(username, &size)) { // ERROR_NONE_MAPPED means the user info is not filled out on this computer return getUsernameError == ERROR_NONE_MAPPED ? NS_ERROR_NOT_AVAILABLE : NS_ERROR_FAILURE; } const DWORD level = 2; LPBYTE info; // If the NetUserGetInfo function has no full name info it will return // success with an empty string. NET_API_STATUS status = NetUserGetInfo(nullptr, username, level, &info); if (status != NERR_Success) { // We have an error with NetUserGetInfo but we know the info is not // filled in because GetUserNameExW returned ERROR_NONE_MAPPED. return getUsernameError == ERROR_NONE_MAPPED ? NS_ERROR_NOT_AVAILABLE : NS_ERROR_FAILURE; } nsDependentString fullName = nsDependentString(reinterpret_cast<USER_INFO_2 *>(info)->usri2_full_name); // NetUserGetInfo returns an empty string if the full name is not filled out if (fullName.Length() == 0) { NetApiBufferFree(info); return NS_ERROR_NOT_AVAILABLE; } *aFullname = ToNewUnicode(fullName); NetApiBufferFree(info); } return (*aFullname) ? NS_OK : NS_ERROR_FAILURE; }
static VOID GetUserProfileData(HWND hwndDlg, PPROFILE_USER_DATA pUserData) { PUSER_INFO_3 userInfo = NULL; NET_API_STATUS status; BOOL bLocal; TCHAR szDrive[8]; INT i; INT nSel; status = NetUserGetInfo(NULL, pUserData->szUserName, 3, (LPBYTE*)&userInfo); if (status != NERR_Success) return; SetDlgItemText(hwndDlg, IDC_USER_PROFILE_PATH, userInfo->usri3_profile); SetDlgItemText(hwndDlg, IDC_USER_PROFILE_SCRIPT, userInfo->usri3_script_path); bLocal = (userInfo->usri3_home_dir_drive == NULL) || (_tcslen(userInfo->usri3_home_dir_drive) == 0); CheckRadioButton(hwndDlg, IDC_USER_PROFILE_LOCAL, IDC_USER_PROFILE_REMOTE, bLocal ? IDC_USER_PROFILE_LOCAL : IDC_USER_PROFILE_REMOTE); for (i = 0; i < 26; i++) { wsprintf(szDrive, _T("%c:"), (TCHAR)('A' + i)); nSel = SendMessage(GetDlgItem(hwndDlg, IDC_USER_PROFILE_DRIVE), CB_INSERTSTRING, -1, (LPARAM)szDrive); } if (bLocal) { SetDlgItemText(hwndDlg, IDC_USER_PROFILE_LOCAL_PATH, userInfo->usri3_home_dir); EnableWindow(GetDlgItem(hwndDlg, IDC_USER_PROFILE_DRIVE), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_USER_PROFILE_REMOTE_PATH), FALSE); } else { SetDlgItemText(hwndDlg, IDC_USER_PROFILE_REMOTE_PATH, userInfo->usri3_home_dir); nSel = SendMessage(GetDlgItem(hwndDlg, IDC_USER_PROFILE_DRIVE), CB_FINDSTRINGEXACT, -1, (LPARAM)userInfo->usri3_home_dir_drive); } SendMessage(GetDlgItem(hwndDlg, IDC_USER_PROFILE_DRIVE), CB_SETCURSEL, nSel, 0); NetApiBufferFree(userInfo); }
/** * Get AD user account properties. * * @param appContext Application context reference. * @param userNameC User name. * @param level Info level. * @param info Account information returned. * @return 0 on success; error code on failure. */ DWORD AdtNetUserGetInfo4( IN AppContextTP appContext, IN PSTR userNameC, OUT PUSER_INFO_4 *info ) { DWORD dwError = ERROR_SUCCESS; PVOID pBuffer = NULL; PWSTR hostName = NULL; PWSTR userName = NULL; PSTR userNameN = NULL; userNameN = GetNameComp(userNameC); dwError = LwMbsToWc16s((PCSTR) (appContext->workConn->serverName), &hostName); ADT_BAIL_ON_ALLOC_FAILURE_NP(!dwError); dwError = LwMbsToWc16s((PCSTR) userNameN, &userName); ADT_BAIL_ON_ALLOC_FAILURE_NP(!dwError); PrintStderr(appContext, LogLevelTrace, "%s: Reading properties of user %s ...\n", appContext->actionName, userNameN); PrintStderr(appContext, LogLevelTrace, "%s: Calling NetUserGetInfo(%s, %s, %d, %s)\n", appContext->actionName, appContext->workConn->serverName, userNameN, 4, "&pBuffer"); dwError = NetUserGetInfo(hostName, userName, 4, &pBuffer); if (dwError) { dwError += ADT_WIN_ERR_BASE; ADT_BAIL_ON_ERROR_NP(dwError); } PrintStderr(appContext, LogLevelTrace, "%s: Done reading properties of user %s\n", appContext->actionName, userNameN); *info = (PUSER_INFO_4) pBuffer; cleanup: LW_SAFE_FREE_MEMORY(hostName); LW_SAFE_FREE_MEMORY(userName); LW_SAFE_FREE_MEMORY(userNameN); return dwError; error: goto cleanup; }
static LPUSER_INFO_1 find_windows_user_entry(char *username) { LPUSER_INFO_1 buf; wchar_t username_wide[32]; mbstowcs(username_wide, username, 32); if (NetUserGetInfo(NULL, username_wide, (DWORD) 1, (LPBYTE *) &buf) == NERR_Success) { return buf; } else { return NULL; } }
BOOL GetUserHomeDir ( LPCSTR lpServer, LPCSTR lpUserName, LPSTR lpHomeDir ) { PUSER_INFO_1 lpUserInfo; NET_API_STATUS nas; WCHAR wcComputerName[CNLEN+3]; WCHAR wcServer[CNLEN], wcUserName[UNLEN]; BOOL isLocal = TRUE; DWORD cchBuffer; if ( lpServer == NULL || *lpServer == '\0' ) { SetLastError ( ERROR_INVALID_ACCOUNT_NAME ); return FALSE; } if ( lpUserName == NULL || *lpUserName == '\0' ) { SetLastError ( ERROR_INVALID_ACCOUNT_NAME ); return FALSE; } mbstowcs ( wcServer, lpServer, lstrlen ( lpServer )+1 ); mbstowcs ( wcUserName, lpUserName, lstrlen ( lpUserName )+1 ); if ( !MakeComputerName ( wcServer, (LPWSTR)wcComputerName ) ) return FALSE; if ( lstrlenW ( wcUserName ) > UNLEN ) { SetLastError ( ERROR_INVALID_ACCOUNT_NAME ); return FALSE; } cchBuffer = CNLEN+3; nas = NetUserGetInfo ( wcComputerName, wcUserName, 1, (LPBYTE *) &lpUserInfo ); if ( nas != NERR_Success ) { SetLastError ( nas ); return FALSE; } wcstombs ( lpHomeDir, lpUserInfo->usri1_home_dir, MAX_PATH ); NetApiBufferFree ( (LPBYTE) lpUserInfo ); return TRUE; }
DWORD GetUserHomeDirA( LPCSTR lpServer, LPCSTR lpUserName, LPSTR lpHomeDir, LPDWORD lpcbHomeDir ) { PUSER_INFO_1 lpUserInfo = NULL; WCHAR wcComputerName[CNLEN+3]; WCHAR wcServer[CNLEN], wcUserName[UNLEN]; LPWSTR _lpServer; DWORD cchBuffer; DWORD dwRetCode; if( lpUserName == NULL || lpHomeDir == NULL || lpcbHomeDir == NULL ) return ERROR_INVALID_PARAMETER; if( lpServer ) mbstowcs( wcServer, lpServer, lstrlen( lpServer )+1 ); mbstowcs( wcUserName, lpUserName, lstrlen( lpUserName )+1 ); if ( lstrlenW( wcUserName ) > UNLEN ) return ERROR_INVALID_ACCOUNT_NAME; if( lpServer == NULL ) _lpServer = NULL; else { cchBuffer = CNLEN+3; dwRetCode = MakeComputerNameW( wcServer, (LPWSTR)wcComputerName, &cchBuffer ); if( dwRetCode != ERROR_SUCCESS ) return dwRetCode; _lpServer = wcComputerName; } dwRetCode = NetUserGetInfo( _lpServer, wcUserName, 1, (LPBYTE *)&lpUserInfo ); if( dwRetCode != NERR_Success ) return dwRetCode; cchBuffer = lstrlenW( lpUserInfo->usri1_home_dir ) + 1; if( cchBuffer > *lpcbHomeDir ) return ERROR_MORE_DATA; wcstombs ( lpHomeDir, lpUserInfo->usri1_home_dir, MAX_PATH ); NetApiBufferFree ( (LPBYTE) lpUserInfo ); return NERR_Success; }
static BOOL win32_fullname(const char *login, char *dest) { WCHAR wszLogin[256]; /* Unicode user name */ struct _USER_INFO_10 *ui; /* User structure */ /* Convert ASCII user name to Unicode. */ MultiByteToWideChar(CP_ACP, 0, login, strlen(login)+1, wszLogin, sizeof(wszLogin)); /* Look up the user on the DC. This function only works for * Windows NT, and not Windows 95. */ if (NetUserGetInfo(NULL, (LPWSTR) &wszLogin, 10, (LPBYTE *) &ui)) return FALSE; /* Convert the Unicode full name to ASCII. */ WideCharToMultiByte(CP_ACP, 0, ui->usri10_full_name, -1, dest, 256, NULL, NULL); return TRUE; }
static VOID GetUserGeneralData(HWND hwndDlg, PGENERAL_USER_DATA pUserData) { PUSER_INFO_3 pUserInfo = NULL; SetDlgItemText(hwndDlg, IDC_USER_GENERAL_NAME, pUserData->szUserName); NetUserGetInfo(NULL, pUserData->szUserName, 3, (LPBYTE*)&pUserInfo); SetDlgItemText(hwndDlg, IDC_USER_GENERAL_FULL_NAME, pUserInfo->usri3_full_name); SetDlgItemText(hwndDlg, IDC_USER_GENERAL_DESCRIPTION, pUserInfo->usri3_comment); pUserData->dwFlags = pUserInfo->usri3_flags; pUserData->dwPasswordExpired = pUserInfo->usri3_password_expired; NetApiBufferFree(pUserInfo); UpdateUserOptions(hwndDlg, pUserData, TRUE); }
/*! @brief ユーザフルネームの取得 (MBCS) */ BOOL CUserInfoDlg::GetFullNameA(char *UserName, char *Domain, char *dest) { WCHAR wszUserName[256]; // Unicode user name WCHAR wszDomain[256]; LPBYTE ComputerName = 0; struct _USER_INFO_2 *ui; // User structure // Convert ASCII user name and domain to Unicode. MultiByteToWideChar(CP_ACP, 0, UserName, strlen(UserName)+1, wszUserName, sizeof(wszUserName) / sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, Domain, strlen(Domain)+1, wszDomain, sizeof(wszDomain) / sizeof(WCHAR) ); BOOL bFoundDC = TRUE; DWORD nRet = NetGetDCName(NULL, NULL, &ComputerName ); // Get the computer name of a DC for the specified domain. if (nRet != NERR_Success) { printf("Error getting user information.\n" ); bFoundDC = FALSE; } // Look up the user on the DC. nRet = NetUserGetInfo((LPWSTR) ComputerName, (LPWSTR) wszUserName, 2, (LPBYTE *) &ui); if (nRet != NERR_Success) { if (bFoundDC == TRUE) { NetApiBufferFree(ComputerName); } printf("Error getting user information.\n" ); return(FALSE ); } if (bFoundDC == TRUE) { NetApiBufferFree(ComputerName); } // Convert the Unicode full name to ASCII. WideCharToMultiByte(CP_ACP, 0, ui->usri2_full_name, -1, dest, 256, NULL, NULL ); return(TRUE ); }
static VOID UpdateUserProperties(HWND hwndDlg) { TCHAR szUserName[UNLEN]; INT iItem; HWND hwndLV; NET_API_STATUS status; PUSER_INFO_2 pUserInfo = NULL; LV_ITEM lvi; hwndLV = GetDlgItem(hwndDlg, IDC_USERS_LIST); iItem = ListView_GetNextItem(hwndLV, -1, LVNI_SELECTED); if (iItem == -1) return; /* Get the new user name */ ListView_GetItemText(hwndLV, iItem, 0, szUserName, UNLEN); status = NetUserGetInfo(NULL, szUserName, 2, (LPBYTE*)&pUserInfo); memset(&lvi, 0x00, sizeof(lvi)); lvi.iItem = iItem; lvi.iSubItem = 0; lvi.mask = LVIF_IMAGE; lvi.iImage = (pUserInfo->usri2_flags & UF_ACCOUNTDISABLE) ? 1 : 0; (void)ListView_SetItem(hwndLV, &lvi); ListView_SetItemText(hwndLV, iItem, 1, pUserInfo->usri2_full_name); ListView_SetItemText(hwndLV, iItem, 2, pUserInfo->usri2_comment); NetApiBufferFree(pUserInfo); }
// Get user name e.g. Julian Smart bool wxGetUserName(wxChar *buf, int maxSize) { wxCHECK_MSG( buf && ( maxSize > 0 ), false, _T("empty buffer in wxGetUserName") ); #if defined(__WXWINCE__) wxLogNull noLog; wxRegKey key(wxRegKey::HKCU, wxT("ControlPanel\\Owner")); if(!key.Open(wxRegKey::Read)) return false; wxString name; if(!key.QueryValue(wxT("Owner"),name)) return false; wxStrncpy(buf, name.c_str(), maxSize-1); buf[maxSize-1] = _T('\0'); return true; #elif defined(USE_NET_API) CHAR szUserName[256]; if ( !wxGetUserId(szUserName, WXSIZEOF(szUserName)) ) return false; // TODO how to get the domain name? CHAR *szDomain = ""; // the code is based on the MSDN example (also see KB article Q119670) WCHAR wszUserName[256]; // Unicode user name WCHAR wszDomain[256]; LPBYTE ComputerName; USER_INFO_2 *ui2; // User structure // Convert ANSI user name and domain to Unicode MultiByteToWideChar( CP_ACP, 0, szUserName, strlen(szUserName)+1, wszUserName, WXSIZEOF(wszUserName) ); MultiByteToWideChar( CP_ACP, 0, szDomain, strlen(szDomain)+1, wszDomain, WXSIZEOF(wszDomain) ); // Get the computer name of a DC for the domain. if ( NetGetDCName( NULL, wszDomain, &ComputerName ) != NERR_Success ) { wxLogError(wxT("Can not find domain controller")); goto error; } // Look up the user on the DC NET_API_STATUS status = NetUserGetInfo( (LPWSTR)ComputerName, (LPWSTR)&wszUserName, 2, // level - we want USER_INFO_2 (LPBYTE *) &ui2 ); switch ( status ) { case NERR_Success: // ok break; case NERR_InvalidComputer: wxLogError(wxT("Invalid domain controller name.")); goto error; case NERR_UserNotFound: wxLogError(wxT("Invalid user name '%s'."), szUserName); goto error; default: wxLogSysError(wxT("Can't get information about user")); goto error; } // Convert the Unicode full name to ANSI WideCharToMultiByte( CP_ACP, 0, ui2->usri2_full_name, -1, buf, maxSize, NULL, NULL ); return true; error: wxLogError(wxT("Couldn't look up full user name.")); return false; #else // !USE_NET_API // Could use NIS, MS-Mail or other site specific programs // Use wxWidgets configuration data bool ok = GetProfileString(WX_SECTION, eUSERNAME, wxEmptyString, buf, maxSize - 1) != 0; if ( !ok ) { ok = wxGetUserId(buf, maxSize); } if ( !ok ) { wxStrncpy(buf, wxT("Unknown User"), maxSize); } return true; #endif // Win32/16 }
Private(const QString &name, PSID sid_ = 0) : userInfo(0), sid(NULL) { LPBYTE servername; NET_API_STATUS status = NetGetAnyDCName(0, 0, &servername); if (status != NERR_Success) { servername = NULL; } if (NetUserGetInfo((LPCWSTR) servername, (LPCWSTR) name.utf16(), 11, (LPBYTE *) &userInfo) != NERR_Success) { goto error; } if (servername) { NetApiBufferFree(servername); servername = 0; } if (!sid_) { DWORD size = 0; SID_NAME_USE nameuse; DWORD cchReferencedDomainName = 0; WCHAR* referencedDomainName = NULL; // the following line definitely fails: // both the sizes for sid and for referencedDomainName are Null // the needed sizes are set in size and cchReferencedDomainName LookupAccountNameW(NULL, (LPCWSTR) name.utf16(), sid, &size, referencedDomainName, &cchReferencedDomainName, &nameuse); sid = (PSID) new SID[size + 1]; referencedDomainName = new WCHAR[cchReferencedDomainName + 1]; if (!LookupAccountNameW(NULL, (LPCWSTR) name.utf16(), sid, &size, referencedDomainName, &cchReferencedDomainName, &nameuse)) { delete[] referencedDomainName; goto error; } // if you want to see both the DomainName and the sid of the user // uncomment the following lines /* LPWSTR sidstring; ConvertSidToStringSidW(sid, &sidstring); qDebug() << QString("\\\\") + QString::fromUtf16(reinterpret_cast<ushort*>(referencedDomainName)) + \ "\\" + name + "(" + QString::fromUtf16(reinterpret_cast<ushort*>(sidstring)) + ")"; LocalFree(sidstring);*/ delete[] referencedDomainName; } else { if (!IsValidSid(sid_)) goto error; DWORD sidlength = GetLengthSid(sid_); sid = (PSID) new BYTE[sidlength]; if (!CopySid(sidlength, sid, sid_)) goto error; } return; error: delete[] sid; sid = 0; if (userInfo) { NetApiBufferFree(userInfo); userInfo = 0; } if (servername) { NetApiBufferFree(servername); servername = 0; } }
static NET_API_STATUS DisplayUser(LPWSTR lpUserName) { PUSER_MODALS_INFO_0 pUserModals = NULL; PUSER_INFO_4 pUserInfo = NULL; PLOCALGROUP_USERS_INFO_0 pLocalGroupInfo = NULL; PGROUP_USERS_INFO_0 pGroupInfo = NULL; DWORD dwLocalGroupRead, dwLocalGroupTotal; DWORD dwGroupRead, dwGroupTotal; DWORD dwLastSet; DWORD i; WCHAR szCountry[40]; INT nPaddedLength = 36; NET_API_STATUS Status; /* Modify the user */ Status = NetUserGetInfo(NULL, lpUserName, 4, (LPBYTE*)&pUserInfo); if (Status != NERR_Success) return Status; Status = NetUserModalsGet(NULL, 0, (LPBYTE*)&pUserModals); if (Status != NERR_Success) goto done; Status = NetUserGetLocalGroups(NULL, lpUserName, 0, 0, (LPBYTE*)&pLocalGroupInfo, MAX_PREFERRED_LENGTH, &dwLocalGroupRead, &dwLocalGroupTotal); if (Status != NERR_Success) goto done; Status = NetUserGetGroups(NULL, lpUserName, 0, (LPBYTE*)&pGroupInfo, MAX_PREFERRED_LENGTH, &dwGroupRead, &dwGroupTotal); if (Status != NERR_Success) goto done; PrintPaddedMessageString(4411, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_name); PrintPaddedMessageString(4412, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_full_name); PrintPaddedMessageString(4413, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_comment); PrintPaddedMessageString(4414, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_usr_comment); PrintPaddedMessageString(4416, nPaddedLength); GetCountryFromCountryCode(pUserInfo->usri4_country_code, ARRAYSIZE(szCountry), szCountry); ConPrintf(StdOut, L"%03ld (%s)\n", pUserInfo->usri4_country_code, szCountry); PrintPaddedMessageString(4419, nPaddedLength); if (pUserInfo->usri4_flags & UF_ACCOUNTDISABLE) PrintMessageString(4301); else if (pUserInfo->usri4_flags & UF_LOCKOUT) PrintMessageString(4440); else PrintMessageString(4300); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4420, nPaddedLength); if (pUserInfo->usri4_acct_expires == TIMEQ_FOREVER) PrintMessageString(4305); else PrintDateTime(pUserInfo->usri4_acct_expires); ConPuts(StdOut, L"\n\n"); PrintPaddedMessageString(4421, nPaddedLength); dwLastSet = GetTimeInSeconds() - pUserInfo->usri4_password_age; PrintDateTime(dwLastSet); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4422, nPaddedLength); if ((pUserInfo->usri4_flags & UF_DONT_EXPIRE_PASSWD) || pUserModals->usrmod0_max_passwd_age == TIMEQ_FOREVER) PrintMessageString(4305); else PrintDateTime(dwLastSet + pUserModals->usrmod0_max_passwd_age); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4423, nPaddedLength); PrintDateTime(dwLastSet + pUserModals->usrmod0_min_passwd_age); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4437, nPaddedLength); PrintMessageString((pUserInfo->usri4_flags & UF_PASSWD_NOTREQD) ? 4301 : 4300); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4438, nPaddedLength); PrintMessageString((pUserInfo->usri4_flags & UF_PASSWD_CANT_CHANGE) ? 4301 : 4300); ConPuts(StdOut, L"\n\n"); PrintPaddedMessageString(4424, nPaddedLength); if (pUserInfo->usri4_workstations == NULL || wcslen(pUserInfo->usri4_workstations) == 0) PrintMessageString(4302); else ConPrintf(StdOut, L"%s", pUserInfo->usri4_workstations); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4429, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_script_path); PrintPaddedMessageString(4439, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_profile); PrintPaddedMessageString(4436, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_home_dir); PrintPaddedMessageString(4430, nPaddedLength); if (pUserInfo->usri4_last_logon == 0) PrintMessageString(4305); else PrintDateTime(pUserInfo->usri4_last_logon); ConPuts(StdOut, L"\n\n"); PrintPaddedMessageString(4432, nPaddedLength); if (pUserInfo->usri4_logon_hours == NULL) PrintMessageString(4302); ConPuts(StdOut, L"\n\n"); ConPuts(StdOut, L"\n"); PrintPaddedMessageString(4427, nPaddedLength); if (dwLocalGroupTotal != 0 && pLocalGroupInfo != NULL) { for (i = 0; i < dwLocalGroupTotal; i++) { if (i != 0) PrintPadding(L' ', nPaddedLength); ConPrintf(StdOut, L"*%s\n", pLocalGroupInfo[i].lgrui0_name); } } else { ConPuts(StdOut, L"\n"); } PrintPaddedMessageString(4431, nPaddedLength); if (dwGroupTotal != 0 && pGroupInfo != NULL) { for (i = 0; i < dwGroupTotal; i++) { if (i != 0) PrintPadding(L' ', nPaddedLength); ConPrintf(StdOut, L"*%s\n", pGroupInfo[i].grui0_name); } } else { ConPuts(StdOut, L"\n"); } done: if (pGroupInfo != NULL) NetApiBufferFree(pGroupInfo); if (pLocalGroupInfo != NULL) NetApiBufferFree(pLocalGroupInfo); if (pUserModals != NULL) NetApiBufferFree(pUserModals); if (pUserInfo != NULL) NetApiBufferFree(pUserInfo); return NERR_Success; }
QueryData genUsers(QueryContext& context) { QueryData results; // USER_INFO_3 conains generic user information LPUSER_INFO_3 pUserBuffer = nullptr; DWORD dwGenericUserLevel = 3; DWORD dwPreferredMaxLength = MAX_PREFERRED_LENGTH; DWORD dwEntriesRead = 0; DWORD dwTotalEntries = 0; DWORD dwResumeHandle = 0; NET_API_STATUS nEnumStatus; nEnumStatus = NetUserEnum(nullptr, dwGenericUserLevel, FILTER_NORMAL_ACCOUNT, (LPBYTE*)&pUserBuffer, dwPreferredMaxLength, &dwEntriesRead, &dwTotalEntries, &dwResumeHandle); // We save the original pointer to the USER_INFO_3 buff for mem management LPUSER_INFO_3 pUserIterationBuffer = pUserBuffer; if (pUserIterationBuffer == nullptr || nEnumStatus != NERR_Success) { if (pUserBuffer != nullptr) { NetApiBufferFree(pUserBuffer); } return results; } for (DWORD i = 0; i < dwEntriesRead; i++) { Row r; r["username"] = wstringToString(pUserIterationBuffer->usri3_name); r["description"] = wstringToString(pUserIterationBuffer->usri3_comment); r["uid"] = BIGINT(pUserIterationBuffer->usri3_user_id); r["gid"] = BIGINT(pUserIterationBuffer->usri3_primary_group_id); r["uid_signed"] = r["uid"]; r["gid_signed"] = r["gid"]; r["shell"] = "C:\\Windows\\system32\\cmd.exe"; // USER_INFO_23 contains detailed info, like the user Sid DWORD dwDetailedUserLevel = 23; LPUSER_INFO_23 pSidUserBuffer = nullptr; NET_API_STATUS nStatus; nStatus = NetUserGetInfo(nullptr, pUserIterationBuffer->usri3_name, dwDetailedUserLevel, (LPBYTE*)&pSidUserBuffer); if (nStatus != NERR_Success) { if (pSidUserBuffer != nullptr) { NetApiBufferFree(pSidUserBuffer); pSidUserBuffer = nullptr; } continue; } LPTSTR sStringSid = nullptr; auto ret = ConvertSidToStringSid(pSidUserBuffer->usri23_user_sid, &sStringSid); if (ret == 0) { if (pSidUserBuffer != nullptr) { NetApiBufferFree(pSidUserBuffer); } continue; } r["uuid"] = sStringSid; std::string query = "SELECT LocalPath FROM Win32_UserProfile where SID=\"" + std::string(sStringSid) + "\""; WmiRequest wmiRequest(query); std::vector<WmiResultItem>& wmiResults = wmiRequest.results(); if (wmiResults.size() != 0) { wmiResults[0].GetString("LocalPath", r["directory"]); } LocalFree(sStringSid); NetApiBufferFree(pSidUserBuffer); results.push_back(r); pUserIterationBuffer++; } NetApiBufferFree(pUserBuffer); if (nEnumStatus == ERROR_MORE_DATA) { LOG(WARNING) << "NetUserEnum contains more data: users table may be incomplete"; } return results; }
static BOOL SetUserProfileData(HWND hwndDlg, PPROFILE_USER_DATA pUserData) { PUSER_INFO_3 pUserInfo = NULL; LPTSTR pszProfilePath = NULL; LPTSTR pszScriptPath = NULL; LPTSTR pszHomeDir = NULL; LPTSTR pszHomeDrive = NULL; NET_API_STATUS status; #if 0 DWORD dwIndex; #endif INT nLength; INT nIndex; NetUserGetInfo(NULL, pUserData->szUserName, 3, (LPBYTE*)&pUserInfo); /* Get the profile path */ nLength = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_USER_PROFILE_PATH)); if (nLength == 0) { pUserInfo->usri3_profile = NULL; } else { pszProfilePath = HeapAlloc(GetProcessHeap(), 0, (nLength + 1) * sizeof(TCHAR)); GetDlgItemText(hwndDlg, IDC_USER_PROFILE_PATH, pszProfilePath, nLength + 1); pUserInfo->usri3_profile = pszProfilePath; } /* Get the script path */ nLength = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_USER_PROFILE_SCRIPT)); if (nLength == 0) { pUserInfo->usri3_script_path = NULL; } else { pszScriptPath = HeapAlloc(GetProcessHeap(), 0, (nLength + 1) * sizeof(TCHAR)); GetDlgItemText(hwndDlg, IDC_USER_PROFILE_SCRIPT, pszScriptPath, nLength + 1); pUserInfo->usri3_script_path = pszScriptPath; } if (IsDlgButtonChecked(hwndDlg, IDC_USER_PROFILE_LOCAL) == BST_CHECKED) { /* Local home directory */ nLength = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_USER_PROFILE_LOCAL_PATH)); if (nLength == 0) { pUserInfo->usri3_home_dir = NULL; } else { pszHomeDir = HeapAlloc(GetProcessHeap(), 0, (nLength + 1) * sizeof(TCHAR)); GetDlgItemText(hwndDlg, IDC_USER_PROFILE_LOCAL_PATH, pszHomeDir, nLength + 1); pUserInfo->usri3_home_dir = pszHomeDir; } } else { /* Remote home directory */ nLength = GetWindowTextLength(GetDlgItem(hwndDlg, IDC_USER_PROFILE_REMOTE_PATH)); if (nLength == 0) { pUserInfo->usri3_home_dir = NULL; } else { pszHomeDir = HeapAlloc(GetProcessHeap(), 0, (nLength + 1) * sizeof(TCHAR)); GetDlgItemText(hwndDlg, IDC_USER_PROFILE_REMOTE_PATH, pszHomeDir, nLength + 1); pUserInfo->usri3_home_dir = pszHomeDir; } nIndex = SendMessage(GetDlgItem(hwndDlg, IDC_USER_PROFILE_DRIVE), CB_GETCURSEL, 0, 0); if (nIndex != CB_ERR) { nLength = SendMessage(GetDlgItem(hwndDlg, IDC_USER_PROFILE_DRIVE), CB_GETLBTEXTLEN, nIndex, 0); pszHomeDrive = HeapAlloc(GetProcessHeap(), 0, (nLength + 1) * sizeof(TCHAR)); SendMessage(GetDlgItem(hwndDlg, IDC_USER_PROFILE_DRIVE), CB_GETLBTEXT, nIndex, (LPARAM)pszHomeDrive); pUserInfo->usri3_home_dir_drive = pszHomeDrive; } } #if 0 status = NetUserSetInfo(NULL, pUserData->szUserName, 3, (LPBYTE)pUserInfo, &dwIndex); if (status != NERR_Success) { DebugPrintf(_T("Status: %lu Index: %lu"), status, dwIndex); } #else status = NERR_Success; #endif if (pszProfilePath) HeapFree(GetProcessHeap(), 0, pszProfilePath); if (pszScriptPath) HeapFree(GetProcessHeap(), 0, pszScriptPath); if (pszHomeDir) HeapFree(GetProcessHeap(), 0, pszHomeDir); if (pszHomeDrive) HeapFree(GetProcessHeap(), 0, pszHomeDrive); NetApiBufferFree(pUserInfo); return (status == NERR_Success); }
INT cmdUser( INT argc, WCHAR **argv) { INT i, j; INT result = 0; BOOL bAdd = FALSE; BOOL bDelete = FALSE; #if 0 BOOL bDomain = FALSE; #endif BOOL bRandomPassword = FALSE; LPWSTR lpUserName = NULL; LPWSTR lpPassword = NULL; PUSER_INFO_4 pUserInfo = NULL; USER_INFO_4 UserInfo; LPWSTR pWorkstations = NULL; LPWSTR p; LPWSTR endptr; DWORD value; BOOL bPasswordAllocated = FALSE; NET_API_STATUS Status; i = 2; if ((i < argc) && (argv[i][0] != L'/')) { lpUserName = argv[i]; // ConPrintf(StdOut, L"User: %s\n", lpUserName); i++; } if ((i < argc) && (argv[i][0] != L'/')) { lpPassword = argv[i]; // ConPrintf(StdOut, L"Password: %s\n", lpPassword); i++; } for (j = i; j < argc; j++) { if (_wcsicmp(argv[j], L"/help") == 0) { PrintNetMessage(MSG_USER_HELP); return 0; } else if (_wcsicmp(argv[j], L"/add") == 0) { bAdd = TRUE; } else if (_wcsicmp(argv[j], L"/delete") == 0) { bDelete = TRUE; } else if (_wcsicmp(argv[j], L"/domain") == 0) { ConPuts(StdErr, L"The /DOMAIN option is not supported yet.\n"); #if 0 bDomain = TRUE; #endif } else if (_wcsicmp(argv[j], L"/random") == 0) { bRandomPassword = TRUE; GenerateRandomPassword(&lpPassword, &bPasswordAllocated); } } if (lpUserName == NULL && lpPassword == NULL) { Status = EnumerateUsers(); ConPrintf(StdOut, L"Status: %lu\n", Status); return 0; } else if (lpUserName != NULL && lpPassword == NULL) { Status = DisplayUser(lpUserName); ConPrintf(StdOut, L"Status: %lu\n", Status); return 0; } if (bAdd && bDelete) { result = 1; goto done; } /* Interactive password input */ if (lpPassword != NULL && wcscmp(lpPassword, L"*") == 0) { ReadPassword(&lpPassword, &bPasswordAllocated); } if (!bAdd && !bDelete) { /* Modify the user */ Status = NetUserGetInfo(NULL, lpUserName, 4, (LPBYTE*)&pUserInfo); if (Status != NERR_Success) { ConPrintf(StdOut, L"Status: %lu\n", Status); result = 1; goto done; } } else if (bAdd && !bDelete) { /* Add the user */ ZeroMemory(&UserInfo, sizeof(USER_INFO_4)); UserInfo.usri4_name = lpUserName; UserInfo.usri4_password = lpPassword; UserInfo.usri4_flags = UF_SCRIPT | UF_NORMAL_ACCOUNT; UserInfo.usri4_acct_expires = TIMEQ_FOREVER; UserInfo.usri4_primary_group_id = DOMAIN_GROUP_RID_USERS; pUserInfo = &UserInfo; } for (j = i; j < argc; j++) { if (_wcsnicmp(argv[j], L"/active:", 8) == 0) { p = &argv[i][8]; if (_wcsicmp(p, L"yes") == 0) { pUserInfo->usri4_flags &= ~UF_ACCOUNTDISABLE; } else if (_wcsicmp(p, L"no") == 0) { pUserInfo->usri4_flags |= UF_ACCOUNTDISABLE; } else { PrintMessageStringV(3952, L"/ACTIVE"); result = 1; goto done; } } else if (_wcsnicmp(argv[j], L"/comment:", 9) == 0) { pUserInfo->usri4_comment = &argv[j][9]; } else if (_wcsnicmp(argv[j], L"/countrycode:", 13) == 0) { p = &argv[i][13]; value = wcstoul(p, &endptr, 10); if (*endptr != 0) { PrintMessageStringV(3952, L"/COUNTRYCODE"); result = 1; goto done; } /* Verify the country code */ if (GetCountryFromCountryCode(value, 0, NULL)) pUserInfo->usri4_country_code = value; } else if (_wcsnicmp(argv[j], L"/expires:", 9) == 0) { p = &argv[i][9]; if (_wcsicmp(p, L"never") == 0) { pUserInfo->usri4_acct_expires = TIMEQ_FOREVER; } else if (!ParseDate(p, &pUserInfo->usri4_acct_expires)) { PrintMessageStringV(3952, L"/EXPIRES"); result = 1; goto done; } } else if (_wcsnicmp(argv[j], L"/fullname:", 10) == 0) { pUserInfo->usri4_full_name = &argv[j][10]; } else if (_wcsnicmp(argv[j], L"/homedir:", 9) == 0) { pUserInfo->usri4_home_dir = &argv[j][9]; } else if (_wcsnicmp(argv[j], L"/passwordchg:", 13) == 0) { p = &argv[i][13]; if (_wcsicmp(p, L"yes") == 0) { pUserInfo->usri4_flags &= ~UF_PASSWD_CANT_CHANGE; } else if (_wcsicmp(p, L"no") == 0) { pUserInfo->usri4_flags |= UF_PASSWD_CANT_CHANGE; } else { PrintMessageStringV(3952, L"/PASSWORDCHG"); result = 1; goto done; } } else if (_wcsnicmp(argv[j], L"/passwordreq:", 13) == 0) { p = &argv[i][13]; if (_wcsicmp(p, L"yes") == 0) { pUserInfo->usri4_flags &= ~UF_PASSWD_NOTREQD; } else if (_wcsicmp(p, L"no") == 0) { pUserInfo->usri4_flags |= UF_PASSWD_NOTREQD; } else { PrintMessageStringV(3952, L"/PASSWORDREQ"); result = 1; goto done; } } else if (_wcsnicmp(argv[j], L"/profilepath:", 13) == 0) { pUserInfo->usri4_profile = &argv[j][13]; } else if (_wcsnicmp(argv[j], L"/scriptpath:", 12) == 0) { pUserInfo->usri4_script_path = &argv[j][12]; } else if (_wcsnicmp(argv[j], L"/times:", 7) == 0) { /* FIXME */ ConPuts(StdErr, L"The /TIMES option is not supported yet.\n"); } else if (_wcsnicmp(argv[j], L"/usercomment:", 13) == 0) { pUserInfo->usri4_usr_comment = &argv[j][13]; } else if (_wcsnicmp(argv[j], L"/workstations:", 14) == 0) { p = &argv[i][14]; if (wcscmp(p, L"*") == 0 || wcscmp(p, L"") == 0) { pUserInfo->usri4_workstations = NULL; } else { Status = BuildWorkstationsList(&pWorkstations, p); if (Status == NERR_Success) { pUserInfo->usri4_workstations = pWorkstations; } else { ConPrintf(StdOut, L"Status %lu\n\n", Status); result = 1; goto done; } } } } if (!bAdd && !bDelete) { /* Modify the user */ Status = NetUserSetInfo(NULL, lpUserName, 4, (LPBYTE)pUserInfo, NULL); ConPrintf(StdOut, L"Status: %lu\n", Status); } else if (bAdd && !bDelete) { /* Add the user */ Status = NetUserAdd(NULL, 4, (LPBYTE)pUserInfo, NULL); ConPrintf(StdOut, L"Status: %lu\n", Status); } else if (!bAdd && bDelete) { /* Delete the user */ Status = NetUserDel(NULL, lpUserName); ConPrintf(StdOut, L"Status: %lu\n", Status); } if (Status == NERR_Success && lpPassword != NULL && bRandomPassword == TRUE) { PrintMessageStringV(3968, lpUserName, lpPassword); } done: if (pWorkstations != NULL) HeapFree(GetProcessHeap(), 0, pWorkstations); if ((bPasswordAllocated == TRUE) && (lpPassword != NULL)) HeapFree(GetProcessHeap(), 0, lpPassword); if (!bAdd && !bDelete && pUserInfo != NULL) NetApiBufferFree(pUserInfo); if (result != 0) { PrintMessageString(4381); ConPuts(StdOut, L"\n"); PrintNetMessage(MSG_USER_SYNTAX); } return result; }
bool torture_libnetapi_user(struct torture_context *tctx) { NET_API_STATUS status = 0; uint8_t *buffer = NULL; uint32_t levels[] = { 0, 1, 2, 3, 4, 10, 11, 20, 23 }; uint32_t enum_levels[] = { 0, 1, 2, 3, 4, 10, 11, 20, 23 }; uint32_t getgr_levels[] = { 0, 1 }; int i; struct USER_INFO_0 u0; struct USER_INFO_1007 u1007; uint32_t parm_err = 0; const char *hostname = torture_setting_string(tctx, "host", NULL); struct libnetapi_ctx *ctx; torture_assert(tctx, torture_libnetapi_init_context(tctx, &ctx), "failed to initialize libnetapi"); torture_comment(tctx, "NetUser tests\n"); /* cleanup */ NetUserDel(hostname, TORTURE_TEST_USER); NetUserDel(hostname, TORTURE_TEST_USER2); /* add a user */ status = test_netuseradd(tctx, hostname, TORTURE_TEST_USER); if (status) { NETAPI_STATUS(tctx, ctx, status, "NetUserAdd"); goto out; } /* enum the new user */ for (i=0; i<ARRAY_SIZE(enum_levels); i++) { status = test_netuserenum(tctx, hostname, enum_levels[i], TORTURE_TEST_USER); if (status) { NETAPI_STATUS(tctx, ctx, status, "NetUserEnum"); goto out; } } /* basic queries */ for (i=0; i<ARRAY_SIZE(levels); i++) { torture_comment(tctx, "Testing NetUserGetInfo level %d\n", levels[i]); status = NetUserGetInfo(hostname, TORTURE_TEST_USER, levels[i], &buffer); if (status && status != 124) { NETAPI_STATUS(tctx, ctx, status, "NetUserGetInfo"); goto out; } } /* testing getgroups */ for (i=0; i<ARRAY_SIZE(getgr_levels); i++) { status = test_netusergetgroups(tctx, hostname, getgr_levels[i], TORTURE_TEST_USER, NULL); if (status) { NETAPI_STATUS(tctx, ctx, status, "NetUserGetGroups"); goto out; } } /* modify description */ torture_comment(tctx, "Testing NetUserSetInfo level %d\n", 1007); u1007.usri1007_comment = "NetApi modified user"; status = NetUserSetInfo(hostname, TORTURE_TEST_USER, 1007, (uint8_t *)&u1007, &parm_err); if (status) { NETAPI_STATUS(tctx, ctx, status, "NetUserSetInfo"); goto out; } /* query info */ for (i=0; i<ARRAY_SIZE(levels); i++) { status = NetUserGetInfo(hostname, TORTURE_TEST_USER, levels[i], &buffer); if (status && status != 124) { NETAPI_STATUS(tctx, ctx, status, "NetUserGetInfo"); goto out; } } torture_comment(tctx, "Testing NetUserSetInfo level 0\n"); u0.usri0_name = TORTURE_TEST_USER2; status = NetUserSetInfo(hostname, TORTURE_TEST_USER, 0, (uint8_t *)&u0, &parm_err); if (status) { NETAPI_STATUS(tctx, ctx, status, "NetUserSetInfo"); goto out; } /* delete */ torture_comment(tctx, "Testing NetUserDel\n"); status = NetUserDel(hostname, TORTURE_TEST_USER2); if (status) { NETAPI_STATUS(tctx, ctx, status, "NetUserDel"); goto out; } /* should not exist anymore */ status = NetUserGetInfo(hostname, TORTURE_TEST_USER2, 0, &buffer); if (status == 0) { NETAPI_STATUS(tctx, ctx, status, "NetUserGetInfo"); status = -1; goto out; } status = test_netusermodals(tctx, ctx, hostname); if (status) { goto out; } status = 0; torture_comment(tctx, "NetUser tests succeeded\n"); out: /* cleanup */ NetUserDel(hostname, TORTURE_TEST_USER); NetUserDel(hostname, TORTURE_TEST_USER2); if (status != 0) { torture_comment(tctx, "NetUser testsuite failed with: %s\n", libnetapi_get_error_string(ctx, status)); libnetapi_free(ctx); return false; } libnetapi_free(ctx); return true; }
int nugi( TCHAR *machine, TCHAR *user ) { DWORD rc; USER_INFO_3 *buf = 0; TCHAR temp[40]; wchar_t unicodeMachine[UNCLEN + 4], unicodeUser[UNLEN + 2]; static flag_t privilegeTexts[] = { { USER_PRIV_GUEST, _T( "USER_PRIV_GUEST" ) }, { USER_PRIV_USER, _T( "USER_PRIV_USER" ) }, { USER_PRIV_ADMIN, _T( "USER_PRIV_ADMIN" ) }, { 0, 0 } }; static flag_t authFlags[] = { { AF_OP_PRINT, _T( "AF_OP_PRINT" ) }, { AF_OP_COMM, _T( "AF_OP_COMM" ) }, { AF_OP_SERVER, _T( "AF_OP_SERVER" ) }, { AF_OP_ACCOUNTS, _T( "AF_OP_ACCOUNTS" ) }, { 0, 0 } }; static flag_t acctFlags[] = { { UF_SCRIPT, _T( "UF_SCRIPT" ) }, { UF_ACCOUNTDISABLE, _T( "UF_ACCOUNTDISABLE" ) }, { UF_HOMEDIR_REQUIRED, _T( "UF_HOMEDIR_REQUIRED" ) }, { UF_PASSWD_NOTREQD, _T( "UF_PASSWD_NOTREQD" ) }, { UF_PASSWD_CANT_CHANGE, _T( "UF_PASSWD_CANT_CHANGE" ) }, { UF_LOCKOUT, _T( "UF_LOCKOUT" ) }, { UF_DONT_EXPIRE_PASSWD, _T( "UF_DONT_EXPIRE_PASSWD" ) }, #ifdef UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED { UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED, _T( "UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED" ) }, #endif #ifdef UF_NOT_DELEGATED { UF_NOT_DELEGATED, _T( "UF_NOT_DELEGATED" ) }, #endif #ifdef UF_SMARTCARD_REQUIRED { UF_SMARTCARD_REQUIRED, _T( "UF_SMARTCARD_REQUIRED" ) }, #endif { UF_NORMAL_ACCOUNT, _T( "UF_NORMAL_ACCOUNT" ) }, { UF_TEMP_DUPLICATE_ACCOUNT, _T( "UF_TEMP_DUPLICATE_ACCOUNT" ) }, { UF_WORKSTATION_TRUST_ACCOUNT, _T( "UF_WORKSTATION_TRUST_ACCOUNT" ) }, { UF_SERVER_TRUST_ACCOUNT, _T( "UF_SERVER_TRUST_ACCOUNT" ) }, { UF_INTERDOMAIN_TRUST_ACCOUNT, _T( "UF_INTERDOMAIN_TRUST_ACCOUNT" ) }, { 0, 0 } }; #ifdef UNICODE _tcsncpy( unicodeMachine, machine, lenof( unicodeMachine ) ); _tcsncpy( unicodeUser, user, lenof( unicodeUser ) ); #else mbstowcs( unicodeMachine, machine, lenof( unicodeMachine ) ); mbstowcs( unicodeUser, user, lenof( unicodeUser ) ); #endif unicodeMachine[lenof( unicodeMachine ) - 1] = _T( '\0' ); unicodeUser[lenof( unicodeUser ) - 1] = _T( '\0' ); _tprintf( _T( "User %s on %s: " ), user, machine ); rc = NetUserGetInfo( unicodeMachine, unicodeUser, 3, (byte **) &buf ); if ( rc != 0 ) { _tprintf( _T( "error %lu.\n" ), rc ); return rc; } _tprintf( _T( "found.\n" ) ); _tprintf( _T( " Name: %ls\n" ), buf->usri3_name ); _tprintf( _T( " Password: %ls\n" ), buf->usri3_password ); _tprintf( _T( " Password age: %lu days, %02lu:%02lu:%02lu\n" ), buf->usri3_password_age / 86400UL, buf->usri3_password_age % 86400UL / 3600UL, buf->usri3_password_age % 3600UL / 60UL, buf->usri3_password_age % 60UL ); _tprintf( _T( " Privilege: %s\n" ), getText( buf->usri3_priv, privilegeTexts ) ); _tprintf( _T( " Home dir: %ls\n" ), buf->usri3_home_dir ); _tprintf( _T( " Comment: %ls\n" ), buf->usri3_comment ); _tprintf( _T( " Flags: %s\n" ), buildFlags( buf->usri3_flags, acctFlags ) ); _tprintf( _T( " Script path: %ls\n" ), buf->usri3_script_path ); _tprintf( _T( " Auth flags: %s\n" ), buildFlags( buf->usri3_auth_flags, authFlags ) ); _tprintf( _T( " Full name: %ls\n" ), buf->usri3_full_name ); _tprintf( _T( " User comment: %ls\n" ), buf->usri3_usr_comment ); _tprintf( _T( " RAS params: (not displayed)\n" ) ); _tprintf( _T( " Workstations: %ls\n" ), buf->usri3_workstations ); _tprintf( _T( " Last logon: %s" ), buf->usri3_last_logon == 0? _T( "never\n" ): _tctime( (long *) &buf->usri3_last_logon ) ); _tprintf( _T( " Last logoff: %s" ), buf->usri3_last_logoff == 0? _T( "unknown\n" ): _tctime( (long *) &buf->usri3_last_logoff ) ); _tprintf( _T( " Expires: %s" ), buf->usri3_acct_expires == TIMEQ_FOREVER? _T( "never\n" ): _tctime( (long *) &buf->usri3_acct_expires ) ); _tprintf( _T( " Max storage: %s\n" ), buf->usri3_max_storage == USER_MAXSTORAGE_UNLIMITED? _T( "unlimited" ): _ultot( buf->usri3_max_storage, temp, 10 ) ); _tprintf( _T( " Logon hours: (not displayed)\n" ) ); _tprintf( _T( " Bad PW count: %s\n" ), buf->usri3_bad_pw_count == (DWORD) -1L? _T( "unlimited" ): _ultot( buf->usri3_bad_pw_count, temp, 10 ) ); _tprintf( _T( " # of logons: %s\n" ), buf->usri3_num_logons == (DWORD) -1L? _T( "unknown" ): _ultot( buf->usri3_num_logons, temp, 10 ) ); _tprintf( _T( " Logon server: %ls\n" ), buf->usri3_logon_server ); _tprintf( _T( " Country code: %lu\n" ), buf->usri3_country_code ); _tprintf( _T( " Code page: %lu\n" ), buf->usri3_code_page ); _tprintf( _T( " User RID: %lu\n" ), buf->usri3_user_id ); _tprintf( _T( " Pgroup RID: %lu\n" ), buf->usri3_primary_group_id ); _tprintf( _T( " Profile path: %ls\n" ), buf->usri3_profile ); _tprintf( _T( " Home drive: %ls\n" ), buf->usri3_home_dir_drive ); _tprintf( _T( " PW expired: %s\n" ), buf->usri3_password_expired? _T( "yes" ): _T( "no" ) ); _tprintf( _T( "\n" ) ); return 0; }
Boolean System::isPrivilegedUser(const String& userName) { Boolean isPrivileged = false; char mUserName[UNLEN+1]; char mDomainName[UNLEN+1]; wchar_t wUserName[UNLEN+1]; wchar_t wDomainName[UNLEN+1]; char* pbs; char userStr[UNLEN+1]; bool usingDomain = false; LPBYTE pComputerName=NULL; DWORD dwLevel = 1; LPUSER_INFO_1 pUserInfo = NULL; NET_API_STATUS nStatus = NULL; //get the username in the correct format strcpy(userStr, (const char*)userName.getCString()); //separate the domain and user name if both are present. if (NULL != (pbs = strchr(userStr, '\\'))) { *pbs = '\0'; strcpy(mDomainName, userStr); strcpy(mUserName, pbs+1); usingDomain = true; } else if ((NULL != (pbs = (strchr(userStr, '@')))) || (NULL != (pbs = (strchr(userStr, '.'))))) { *pbs = '\0'; strcpy(mDomainName, pbs+1); strcpy(mUserName, userStr); usingDomain = true; } else { strcpy(mDomainName, "."); strcpy(mUserName, userStr); } //convert domain name to unicode if (!MultiByteToWideChar( CP_ACP, 0, mDomainName, -1, wDomainName, (int)(strlen(mDomainName) + 1))) { return false; } //convert username to unicode if (!MultiByteToWideChar( CP_ACP, 0, mUserName, -1, wUserName, (int)(strlen(mUserName) + 1))) { return false; } if (usingDomain) { //get domain controller DWORD rc = NetGetDCName(NULL, wDomainName, &pComputerName); if (rc == NERR_Success) { // this is automatically prefixed with "\\" wcscpy(wDomainName, (LPWSTR) pComputerName); } /* else { // failover // ATTN: This is commented out until there is resolution on // Bugzilla 2236. -hns 2/2005 // This needs to be more thoroughly tested when we uncomment it out. PDOMAIN_CONTROLLER_INFO DomainControllerInfo = NULL; //this function does not take wide strings rc = DsGetDcName(NULL, mDomainName, NULL, NULL, // not sure what flags we want here DS_DIRECTORY_SERVICE_REQUIRED, &DomainControllerInfo); if (rc == ERROR_SUCCESS && DomainControllerInfo) { strcpy(mDomainName, DomainControllerInfo->DomainName); NetApiBufferFree(DomainControllerInfo); if (!MultiByteToWideChar( CP_ACP, 0, mDomainName, -1, wDomainName, strlen(mDomainName) + 1)) { return false; } } } */ } //get privileges nStatus = NetUserGetInfo(wDomainName, wUserName, dwLevel, (LPBYTE *)&pUserInfo); if ((nStatus == NERR_Success) && (pUserInfo != NULL) && (pUserInfo->usri1_priv == USER_PRIV_ADMIN)) { isPrivileged = true; } if (pComputerName != NULL) { NetApiBufferFree(pComputerName); } if (pUserInfo != NULL) { NetApiBufferFree(pUserInfo); } return isPrivileged; }
Boolean System::isSystemUser(const char* userName) { if (processUserName.size() == 0) { // Lock and recheck the processUserName length in case two threads // enter this block simultaneously AutoMutex mut(processUserNameMut); if (processUserName.size() == 0) { processUserName = getEffectiveUserName(); } } if (processUserName == userName) { return true; } Boolean isSystemUser = false; char mUserName[UNLEN+1]; char mDomainName[UNLEN+1]; char tUserName[UNLEN+1]; wchar_t wUserName[UNLEN+1]; wchar_t wDomainName[UNLEN+1]; char* pbs; bool usingDomain = false; LPBYTE pComputerName=NULL; DWORD dwLevel = 1; LPUSER_INFO_1 pUserInfo = NULL; NET_API_STATUS nStatus = NULL; // Make a copy of the specified username, it cannot be used directly // because it's declared as const and strchr() may modify the string. strncpy(tUserName, userName, sizeof(tUserName) - 1); tUserName[sizeof(tUserName)- 1] = '\0'; //separate the domain and user name if both are present. if (NULL != (pbs = strchr(tUserName, '\\'))) { *pbs = '\0'; strcpy(mDomainName, tUserName); strcpy(mUserName, pbs+1); usingDomain = true; } else if ((NULL != (pbs = (strchr(tUserName, '@')))) || (NULL != (pbs = (strchr(tUserName, '.'))))) { *pbs = '\0'; strcpy(mDomainName, pbs+1); strcpy(mUserName, tUserName); usingDomain = true; } else { strcpy(mDomainName, "."); strcpy(mUserName, tUserName); } //convert domain name to unicode if (!MultiByteToWideChar( CP_ACP, 0, mDomainName, -1, wDomainName, (int)(strlen(mDomainName) + 1))) { return false; } //convert username to unicode if (!MultiByteToWideChar( CP_ACP, 0, mUserName, -1, wUserName, (int)(strlen(mUserName) + 1))) { return false; } if (usingDomain) { //get domain controller DWORD rc = NetGetDCName(NULL, wDomainName, &pComputerName); if (rc == NERR_Success) { // this is automatically prefixed with "\\" wcscpy(wDomainName, (LPWSTR) pComputerName); } /* else { // failover // ATTN: This is commented out until there is resolution on // Bugzilla 2236. -hns 2/2005 // This needs to be more thoroughly tested when we uncomment it out. PDOMAIN_CONTROLLER_INFO DomainControllerInfo = NULL; //this function does not take wide strings rc = DsGetDcName(NULL, mDomainName, NULL, NULL, //not sure what flags we want here DS_DIRECTORY_SERVICE_REQUIRED, &DomainControllerInfo); if (rc == ERROR_SUCCESS && DomainControllerInfo) { strcpy(mDomainName, DomainControllerInfo->DomainName); NetApiBufferFree(DomainControllerInfo); if (!MultiByteToWideChar( CP_ACP, 0, mDomainName, -1, wDomainName, strlen(mDomainName) + 1)) { return false; } } } */ } //get user info nStatus = NetUserGetInfo(wDomainName, wUserName, dwLevel, (LPBYTE *)&pUserInfo); if (nStatus == NERR_Success) { isSystemUser = true; } if (pComputerName != NULL) { NetApiBufferFree(pComputerName); } if (pUserInfo != NULL) { NetApiBufferFree(pUserInfo); } return isSystemUser; }
INT cmdUser( INT argc, WCHAR **argv) { INT i, j; INT result = 0; BOOL bAdd = FALSE; BOOL bDelete = FALSE; #if 0 BOOL bDomain = FALSE; #endif LPWSTR lpUserName = NULL; LPWSTR lpPassword = NULL; PUSER_INFO_4 pUserInfo = NULL; USER_INFO_4 UserInfo; LPWSTR p; LPWSTR endptr; DWORD value; BOOL bPasswordAllocated = FALSE; NET_API_STATUS Status; if (argc == 2) { Status = EnumerateUsers(); ConPrintf(StdOut, L"Status: %lu\n", Status); return 0; } else if (argc == 3) { Status = DisplayUser(argv[2]); ConPrintf(StdOut, L"Status: %lu\n", Status); return 0; } i = 2; if (argv[i][0] != L'/') { lpUserName = argv[i]; // ConPrintf(StdOut, L"User: %s\n", lpUserName); i++; } if (argv[i][0] != L'/') { lpPassword = argv[i]; // ConPrintf(StdOut, L"Password: %s\n", lpPassword); i++; } for (j = i; j < argc; j++) { if (_wcsicmp(argv[j], L"/help") == 0) { ConResPuts(StdOut, IDS_USER_HELP); return 0; } else if (_wcsicmp(argv[j], L"/add") == 0) { bAdd = TRUE; } else if (_wcsicmp(argv[j], L"/delete") == 0) { bDelete = TRUE; } else if (_wcsicmp(argv[j], L"/domain") == 0) { ConResPrintf(StdErr, IDS_ERROR_OPTION_NOT_SUPPORTED, L"/DOMAIN"); #if 0 bDomain = TRUE; #endif } } if (bAdd && bDelete) { result = 1; goto done; } /* Interactive password input */ if (lpPassword != NULL && wcscmp(lpPassword, L"*") == 0) { ReadPassword(&lpPassword, &bPasswordAllocated); } if (!bAdd && !bDelete) { /* Modify the user */ Status = NetUserGetInfo(NULL, lpUserName, 4, (LPBYTE*)&pUserInfo); if (Status != NERR_Success) { ConPrintf(StdOut, L"Status: %lu\n", Status); result = 1; goto done; } } else if (bAdd && !bDelete) { /* Add the user */ ZeroMemory(&UserInfo, sizeof(USER_INFO_4)); UserInfo.usri4_name = lpUserName; UserInfo.usri4_password = lpPassword; UserInfo.usri4_flags = UF_SCRIPT | UF_NORMAL_ACCOUNT; pUserInfo = &UserInfo; } for (j = i; j < argc; j++) { if (_wcsnicmp(argv[j], L"/active:", 8) == 0) { p = &argv[i][8]; if (_wcsicmp(p, L"yes") == 0) { pUserInfo->usri4_flags &= ~UF_ACCOUNTDISABLE; } else if (_wcsicmp(p, L"no") == 0) { pUserInfo->usri4_flags |= UF_ACCOUNTDISABLE; } else { ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/ACTIVE"); result = 1; goto done; } } else if (_wcsnicmp(argv[j], L"/comment:", 9) == 0) { pUserInfo->usri4_comment = &argv[j][9]; } else if (_wcsnicmp(argv[j], L"/countrycode:", 13) == 0) { p = &argv[i][13]; value = wcstoul(p, &endptr, 10); if (*endptr != 0) { ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/COUNTRYCODE"); result = 1; goto done; } /* FIXME: verify the country code */ pUserInfo->usri4_country_code = value; } else if (_wcsnicmp(argv[j], L"/expires:", 9) == 0) { p = &argv[i][9]; if (_wcsicmp(p, L"never") == 0) { pUserInfo->usri4_acct_expires = TIMEQ_FOREVER; } else { /* FIXME: Parse the date */ ConResPrintf(StdErr, IDS_ERROR_OPTION_NOT_SUPPORTED, L"/EXPIRES"); } } else if (_wcsnicmp(argv[j], L"/fullname:", 10) == 0) { pUserInfo->usri4_full_name = &argv[j][10]; } else if (_wcsnicmp(argv[j], L"/homedir:", 9) == 0) { pUserInfo->usri4_home_dir = &argv[j][9]; } else if (_wcsnicmp(argv[j], L"/passwordchg:", 13) == 0) { p = &argv[i][13]; if (_wcsicmp(p, L"yes") == 0) { pUserInfo->usri4_flags &= ~UF_PASSWD_CANT_CHANGE; } else if (_wcsicmp(p, L"no") == 0) { pUserInfo->usri4_flags |= UF_PASSWD_CANT_CHANGE; } else { ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/PASSWORDCHG"); result = 1; goto done; } } else if (_wcsnicmp(argv[j], L"/passwordreq:", 13) == 0) { p = &argv[i][13]; if (_wcsicmp(p, L"yes") == 0) { pUserInfo->usri4_flags &= ~UF_PASSWD_NOTREQD; } else if (_wcsicmp(p, L"no") == 0) { pUserInfo->usri4_flags |= UF_PASSWD_NOTREQD; } else { ConResPrintf(StdErr, IDS_ERROR_INVALID_OPTION_VALUE, L"/PASSWORDREQ"); result = 1; goto done; } } else if (_wcsnicmp(argv[j], L"/profilepath:", 13) == 0) { pUserInfo->usri4_profile = &argv[j][13]; } else if (_wcsnicmp(argv[j], L"/scriptpath:", 12) == 0) { pUserInfo->usri4_script_path = &argv[j][12]; } else if (_wcsnicmp(argv[j], L"/times:", 7) == 0) { /* FIXME */ ConResPrintf(StdErr, IDS_ERROR_OPTION_NOT_SUPPORTED, L"/TIMES"); } else if (_wcsnicmp(argv[j], L"/usercomment:", 13) == 0) { pUserInfo->usri4_usr_comment = &argv[j][13]; } else if (_wcsnicmp(argv[j], L"/workstations:", 14) == 0) { /* FIXME */ ConResPrintf(StdErr, IDS_ERROR_OPTION_NOT_SUPPORTED, L"/WORKSTATIONS"); } } if (!bAdd && !bDelete) { /* Modify the user */ Status = NetUserSetInfo(NULL, lpUserName, 4, (LPBYTE)pUserInfo, NULL); ConPrintf(StdOut, L"Status: %lu\n", Status); } else if (bAdd && !bDelete) { /* Add the user */ Status = NetUserAdd(NULL, 4, (LPBYTE)pUserInfo, NULL); ConPrintf(StdOut, L"Status: %lu\n", Status); } else if (!bAdd && bDelete) { /* Delete the user */ Status = NetUserDel(NULL, lpUserName); ConPrintf(StdOut, L"Status: %lu\n", Status); } done: if (bPasswordAllocated == TRUE && lpPassword != NULL) HeapFree(GetProcessHeap(), 0, lpPassword); if (!bAdd && !bDelete && pUserInfo != NULL) NetApiBufferFree(pUserInfo); if (result != 0) ConResPuts(StdOut, IDS_USER_SYNTAX); return result; }
static NET_API_STATUS DisplayUser(LPWSTR lpUserName) { PUSER_MODALS_INFO_0 pUserModals = NULL; PUSER_INFO_4 pUserInfo = NULL; PLOCALGROUP_USERS_INFO_0 pLocalGroupInfo = NULL; PGROUP_USERS_INFO_0 pGroupInfo = NULL; DWORD dwLocalGroupRead, dwLocalGroupTotal; DWORD dwGroupRead, dwGroupTotal; DWORD dwLastSet; DWORD i; INT nPaddedLength = 29; NET_API_STATUS Status; /* Modify the user */ Status = NetUserGetInfo(NULL, lpUserName, 4, (LPBYTE*)&pUserInfo); if (Status != NERR_Success) return Status; Status = NetUserModalsGet(NULL, 0, (LPBYTE*)&pUserModals); if (Status != NERR_Success) goto done; Status = NetUserGetLocalGroups(NULL, lpUserName, 0, 0, (LPBYTE*)&pLocalGroupInfo, MAX_PREFERRED_LENGTH, &dwLocalGroupRead, &dwLocalGroupTotal); if (Status != NERR_Success) goto done; Status = NetUserGetGroups(NULL, lpUserName, 0, (LPBYTE*)&pGroupInfo, MAX_PREFERRED_LENGTH, &dwGroupRead, &dwGroupTotal); if (Status != NERR_Success) goto done; PrintPaddedResourceString(IDS_USER_NAME, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_name); PrintPaddedResourceString(IDS_USER_FULL_NAME, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_full_name); PrintPaddedResourceString(IDS_USER_COMMENT, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_comment); PrintPaddedResourceString(IDS_USER_USER_COMMENT, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_usr_comment); PrintPaddedResourceString(IDS_USER_COUNTRY_CODE, nPaddedLength); ConPrintf(StdOut, L"%03ld ()\n", pUserInfo->usri4_country_code); PrintPaddedResourceString(IDS_USER_ACCOUNT_ACTIVE, nPaddedLength); if (pUserInfo->usri4_flags & UF_ACCOUNTDISABLE) ConResPuts(StdOut, IDS_GENERIC_NO); else if (pUserInfo->usri4_flags & UF_LOCKOUT) ConResPuts(StdOut, IDS_GENERIC_LOCKED); else ConResPuts(StdOut, IDS_GENERIC_YES); ConPuts(StdOut, L"\n"); PrintPaddedResourceString(IDS_USER_ACCOUNT_EXPIRES, nPaddedLength); if (pUserInfo->usri4_acct_expires == TIMEQ_FOREVER) ConResPuts(StdOut, IDS_GENERIC_NEVER); else PrintDateTime(pUserInfo->usri4_acct_expires); ConPuts(StdOut, L"\n\n"); PrintPaddedResourceString(IDS_USER_PW_LAST_SET, nPaddedLength); dwLastSet = GetTimeInSeconds() - pUserInfo->usri4_password_age; PrintDateTime(dwLastSet); PrintPaddedResourceString(IDS_USER_PW_EXPIRES, nPaddedLength); if ((pUserInfo->usri4_flags & UF_DONT_EXPIRE_PASSWD) || pUserModals->usrmod0_max_passwd_age == TIMEQ_FOREVER) ConResPuts(StdOut, IDS_GENERIC_NEVER); else PrintDateTime(dwLastSet + pUserModals->usrmod0_max_passwd_age); ConPuts(StdOut, L"\n"); PrintPaddedResourceString(IDS_USER_PW_CHANGEABLE, nPaddedLength); PrintDateTime(dwLastSet + pUserModals->usrmod0_min_passwd_age); PrintPaddedResourceString(IDS_USER_PW_REQUIRED, nPaddedLength); ConResPuts(StdOut, (pUserInfo->usri4_flags & UF_PASSWD_NOTREQD) ? IDS_GENERIC_NO : IDS_GENERIC_YES); ConPuts(StdOut, L"\n"); PrintPaddedResourceString(IDS_USER_CHANGE_PW, nPaddedLength); ConResPuts(StdOut, (pUserInfo->usri4_flags & UF_PASSWD_CANT_CHANGE) ? IDS_GENERIC_NO : IDS_GENERIC_YES); ConPuts(StdOut, L"\n\n"); PrintPaddedResourceString(IDS_USER_WORKSTATIONS, nPaddedLength); if (pUserInfo->usri4_workstations == NULL || wcslen(pUserInfo->usri4_workstations) == 0) ConResPuts(StdOut, IDS_GENERIC_ALL); else ConPrintf(StdOut, L"%s", pUserInfo->usri4_workstations); ConPuts(StdOut, L"\n"); PrintPaddedResourceString(IDS_USER_LOGON_SCRIPT, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_script_path); PrintPaddedResourceString(IDS_USER_PROFILE, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_profile); PrintPaddedResourceString(IDS_USER_HOME_DIR, nPaddedLength); ConPrintf(StdOut, L"%s\n", pUserInfo->usri4_home_dir); PrintPaddedResourceString(IDS_USER_LAST_LOGON, nPaddedLength); if (pUserInfo->usri4_last_logon == 0) ConResPuts(StdOut, IDS_GENERIC_NEVER); else PrintDateTime(pUserInfo->usri4_last_logon); ConPuts(StdOut, L"\n\n"); PrintPaddedResourceString(IDS_USER_LOGON_HOURS, nPaddedLength); if (pUserInfo->usri4_logon_hours == NULL) ConResPuts(StdOut, IDS_GENERIC_ALL); ConPuts(StdOut, L"\n\n"); ConPuts(StdOut, L"\n"); PrintPaddedResourceString(IDS_USER_LOCAL_GROUPS, nPaddedLength); if (dwLocalGroupTotal != 0 && pLocalGroupInfo != NULL) { for (i = 0; i < dwLocalGroupTotal; i++) { if (i != 0) PrintPadding(L' ', nPaddedLength); ConPrintf(StdOut, L"*%s\n", pLocalGroupInfo[i].lgrui0_name); } } else { ConPuts(StdOut, L"\n"); } PrintPaddedResourceString(IDS_USER_GLOBAL_GROUPS, nPaddedLength); if (dwGroupTotal != 0 && pGroupInfo != NULL) { for (i = 0; i < dwGroupTotal; i++) { if (i != 0) PrintPadding(L' ', nPaddedLength); ConPrintf(StdOut, L"*%s\n", pGroupInfo[i].grui0_name); } } else { ConPuts(StdOut, L"\n"); } done: if (pGroupInfo != NULL) NetApiBufferFree(pGroupInfo); if (pLocalGroupInfo != NULL) NetApiBufferFree(pLocalGroupInfo); if (pUserModals != NULL) NetApiBufferFree(pUserModals); if (pUserInfo != NULL) NetApiBufferFree(pUserInfo); return NERR_Success; }
BOOL CShowActiveDirUsers::GetFullUserName(LPTSTR szUser, LPTSTR szDomain, LPTSTR szFullUserName, LPTSTR szDescription) { BOOL bResult = FALSE; LPWSTR pServer = NULL; BOOL bLocal = FALSE; TCHAR szComputerName[_MAX_PATH]; TCHAR szDomainName[_MAX_PATH]; TCHAR szServer[_MAX_PATH]; TCHAR szPDC[_MAX_PATH]; DWORD dwLevel = 10; LPUSER_INFO_10 pUserInfoBuffer = NULL; // init ZeroMemory(szComputerName, _MAX_PATH); ZeroMemory(szDomainName, _MAX_PATH); ZeroMemory(szServer, _MAX_PATH); ZeroMemory(szPDC, _MAX_PATH); GetLocalComputerName(szComputerName); if (_tcsicmp(szComputerName, szDomain) == 0) bLocal = TRUE; // for active directory native, szUser comes in as [email protected] if (!bLocal) { GetDCName(szPDC, szDomain); if (_tcschr(szUser, _T('@')) ) { GetUserAndDomainNameFromUPN(szUser, szFullUserName, szDomainName); _tcscpy(szUser, szFullUserName); _tcscpy(szDomain, szDomainName); } } else { NetApiBufferAllocate(_MAX_PATH, (LPVOID*)&pServer); ZeroMemory(pServer, _MAX_PATH); _tcscpy(pServer, _T("\\\\")); _tcscat(pServer, szComputerName); } // grab the details of the user account, // may fail if AD=native & user not in proper security group if (NERR_Success == NetUserGetInfo(szPDC, szUser, dwLevel, (LPBYTE*)&pUserInfoBuffer)) { if (pUserInfoBuffer) { _tcscpy(szFullUserName, pUserInfoBuffer->usri10_full_name); _tcscpy(szDescription, pUserInfoBuffer->usri10_comment); bResult = TRUE; } } if (pUserInfoBuffer) NetApiBufferFree(pUserInfoBuffer); if (pServer) NetApiBufferFree(pServer); return bResult; }