#include "winnt.hxx" #pragma hdrstop HRESULT WinNTCreateComputer( LPWSTR szServerName, LPWSTR szComputerName ); HRESULT WinNTDeleteComputer( LPWSTR szServerName, LPWSTR szComputerName ); HRESULT WinNTCreateLocalGroup( LPWSTR szServerName, LPWSTR szGroupName ); HRESULT WinNTCreateGlobalGroup( LPWSTR szServerName, LPWSTR szGroupName ); HRESULT WinNTDeleteLocalGroup( LPWSTR szServerName, LPWSTR szGroupName ); HRESULT WinNTDeleteGlobalGroup( LPWSTR szServerName, LPWSTR szGroupName ); HRESULT WinNTCreateUser( LPWSTR szServerName, LPWSTR szUserName ); HRESULT WinNTDeleteUser( LPWSTR szServerName, LPWSTR szUserName ); HRESULT WinNTCreateComputer( LPWSTR szServerName, LPWSTR szComputerName ) { HRESULT hr = S_OK; WCHAR szTargBuffer[MAX_PATH]; WCHAR szComputerBuffer[MAX_PATH]; USER_INFO_1 UserInfo1; PUSER_INFO_1 pUserInfo1 = &UserInfo1; NET_API_STATUS nasStatus; DWORD dwParmErr; if (!szServerName || !szComputerName ) { RRETURN(E_FAIL); } wcscpy(szComputerBuffer, szComputerName); wcscat(szComputerBuffer, L"$"); memset(pUserInfo1, 0, sizeof(USER_INFO_1)); pUserInfo1->usri1_name = szComputerBuffer; pUserInfo1->usri1_password = NULL; pUserInfo1->usri1_password_age = 0; pUserInfo1->usri1_priv = USER_PRIV_USER; pUserInfo1->usri1_home_dir = NULL; pUserInfo1->usri1_comment = NULL; pUserInfo1->usri1_flags = UF_SCRIPT | UF_WORKSTATION_TRUST_ACCOUNT ; pUserInfo1->usri1_script_path = NULL; hr = MakeUncName( szServerName, szTargBuffer ); BAIL_ON_FAILURE(hr); nasStatus = NetUserAdd( szTargBuffer, 1, (LPBYTE)pUserInfo1, &dwParmErr ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT WinNTDeleteComputer( LPWSTR szServerName, LPWSTR szComputerName ) { HRESULT hr = S_OK; NET_API_STATUS nasStatus; WCHAR szComputerBuffer[MAX_PATH]; WCHAR szTargBuffer[MAX_PATH]; if (!szServerName || !szComputerName ) { RRETURN(E_FAIL); } wcscpy(szComputerBuffer, szComputerName); wcscat(szComputerBuffer, L"$"); hr = MakeUncName( szServerName, szTargBuffer ); BAIL_ON_FAILURE(hr); nasStatus = NetUserDel( szTargBuffer, szComputerBuffer ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT WinNTCreateGlobalGroup( LPWSTR szServerName, LPWSTR szGroupName ) { HRESULT hr = S_OK; WCHAR szTargBuffer[MAX_PATH]; GROUP_INFO_1 GroupInfo1; PGROUP_INFO_1 pGroupInfo1 = &GroupInfo1; NET_API_STATUS nasStatus; DWORD dwParmErr; memset(pGroupInfo1, 0, sizeof(GROUP_INFO_1)); pGroupInfo1->grpi1_name = szGroupName; if (!szServerName || !szGroupName ) { RRETURN(E_FAIL); } hr = MakeUncName( szServerName, szTargBuffer ); BAIL_ON_FAILURE(hr); nasStatus = NetGroupAdd( szTargBuffer, 1, (LPBYTE)pGroupInfo1, &dwParmErr ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT WinNTCreateLocalGroup( LPWSTR szServerName, LPWSTR szGroupName ) { HRESULT hr = S_OK; WCHAR szTargBuffer[MAX_PATH]; LOCALGROUP_INFO_1 LocalGroupInfo1; PLOCALGROUP_INFO_1 pLocalGroupInfo1 = &LocalGroupInfo1; NET_API_STATUS nasStatus; DWORD dwParmErr; memset(pLocalGroupInfo1, 0, sizeof(LOCALGROUP_INFO_1)); pLocalGroupInfo1->lgrpi1_name = szGroupName; if (!szServerName || !szGroupName ) { RRETURN(E_FAIL); } hr = MakeUncName( szServerName, szTargBuffer ); BAIL_ON_FAILURE(hr); nasStatus = NetLocalGroupAdd( szTargBuffer, 1, (LPBYTE)pLocalGroupInfo1, &dwParmErr ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT WinNTDeleteLocalGroup( LPWSTR szServerName, LPWSTR szGroupName ) { WCHAR szTargBuffer[MAX_PATH]; HRESULT hr; NET_API_STATUS nasStatus; if (!szServerName || !szGroupName ) { RRETURN(E_FAIL); } hr = MakeUncName( szServerName, szTargBuffer ); BAIL_ON_FAILURE(hr); nasStatus = NetLocalGroupDel( szTargBuffer, szGroupName ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT WinNTDeleteGlobalGroup( LPWSTR szServerName, LPWSTR szGroupName ) { HRESULT hr; NET_API_STATUS nasStatus; WCHAR szTargBuffer[MAX_PATH]; if (!szServerName || !szGroupName ) { RRETURN(E_FAIL); } hr = MakeUncName( szServerName, szTargBuffer ); BAIL_ON_FAILURE(hr); nasStatus = NetGroupDel( szTargBuffer, szGroupName ); hr = HRESULT_FROM_WIN32(nasStatus); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT WinNTCreateUser( LPWSTR szServerName, LPWSTR szUserName, LPWSTR szUserPassword ) { HRESULT hr = S_OK; WCHAR szTargBuffer[MAX_PATH]; USER_INFO_1 UserInfo1; PUSER_INFO_1 pUserInfo1 = &UserInfo1; NET_API_STATUS nasStatus; DWORD dwParmErr; WCHAR szCompName[MAX_PATH]; DWORD dwSize = MAX_PATH; if (!szServerName || !szUserName ) { RRETURN(E_FAIL); } memset(pUserInfo1, 0, sizeof(USER_INFO_1)); pUserInfo1->usri1_name = szUserName; pUserInfo1->usri1_password = szUserPassword; pUserInfo1->usri1_password_age = DEF_MAX_PWAGE; pUserInfo1->usri1_priv = 1; pUserInfo1->usri1_home_dir = NULL; pUserInfo1->usri1_comment = NULL; pUserInfo1->usri1_script_path = NULL; pUserInfo1->usri1_flags = UF_NORMAL_ACCOUNT | UF_SCRIPT; hr = MakeUncName( szServerName, szTargBuffer ); BAIL_ON_FAILURE(hr); nasStatus = NetUserAdd( szTargBuffer, USER_PRIV_USER, (LPBYTE)pUserInfo1, &dwParmErr ); hr = HRESULT_FROM_WIN32(nasStatus); // // If we fail without workstation services, check if the // machine name matches and if so add with NULL as name // if (hr == HRESULT_FROM_WIN32(NERR_WkstaNotStarted)) { if (!GetComputerName(szCompName, &dwSize)) { // We cannot get the computer name so bail BAIL_ON_FAILURE(hr); } // Compare the names before we continue #ifdef WIN95 if (_wcsicmp(szServerName, szCompName)) { #else if (CompareStringW( LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, szServerName, -1, szCompName, -1 ) != CSTR_EQUAL ) { #endif // names do not match BAIL_ON_FAILURE(hr); } nasStatus = NetUserAdd( NULL, USER_PRIV_USER, (LPBYTE)pUserInfo1, &dwParmErr ); hr = HRESULT_FROM_WIN32(nasStatus); } BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT WinNTDeleteUser( LPWSTR szServerName, LPWSTR szUserName ) { HRESULT hr; NET_API_STATUS nasStatus; WCHAR szTargBuffer[MAX_PATH]; WCHAR szCompName[MAX_PATH]; DWORD dwSize = MAX_PATH; if (!szServerName || !szUserName ) { RRETURN(E_FAIL); } hr = MakeUncName( szServerName, szTargBuffer ); BAIL_ON_FAILURE(hr); nasStatus = NetUserDel( szTargBuffer, szUserName ); hr = HRESULT_FROM_WIN32(nasStatus); // // If we fail without workstation services, check if the // machine name matches and if so add with NULL as name // if (hr == HRESULT_FROM_WIN32(NERR_WkstaNotStarted)) { if (!GetComputerName(szCompName, &dwSize)) { // We cannot get the computer name so bail BAIL_ON_FAILURE(hr); } // Compare the names before we continue #ifdef WIN95 if (_wcsicmp(szServerName, szCompName)) { #else if (CompareStringW( LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, szServerName, -1, szCompName, -1 ) != CSTR_EQUAL ) { #endif // names do not match BAIL_ON_FAILURE(hr); } nasStatus = NetUserDel( NULL, szUserName ); hr = HRESULT_FROM_WIN32(nasStatus); } BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT WinNTDeleteGroup( POBJECTINFO pObjectInfo, DWORD dwGroupType, const CWinNTCredentials& Credentials ) { WCHAR szHostServerName[MAX_PATH]; HRESULT hr; NET_API_STATUS nasStatus; if (!pObjectInfo) { RRETURN(E_FAIL); } switch (pObjectInfo->NumComponents) { case 2: hr = WinNTGetCachedDCName( pObjectInfo->ComponentArray[0], szHostServerName, Credentials.GetFlags() // we need writeable dc ); BAIL_ON_FAILURE(hr); if (dwGroupType == WINNT_GROUP_EITHER) { // // - try both local and global groups if "group" for backward // compatability // - confirmed with cliffv (no global and local group under same // container in nt4 or nt5. So ok. hr = WinNTDeleteGlobalGroup( (szHostServerName +2), pObjectInfo->ComponentArray[1] ); if (FAILED(hr)) { hr = WinNTDeleteLocalGroup( (szHostServerName + 2), pObjectInfo->ComponentArray[1] ); } } else if (dwGroupType == WINNT_GROUP_LOCAL) { hr = WinNTDeleteLocalGroup( (szHostServerName + 2), pObjectInfo->ComponentArray[1] ); } else if (dwGroupType == WINNT_GROUP_GLOBAL) { hr = WinNTDeleteGlobalGroup( (szHostServerName + 2), pObjectInfo->ComponentArray[1] ); } else { // // private funct'n -> must be ADSI own coding bug // ADsAssert(FALSE); } BAIL_ON_FAILURE(hr); break; case 3: if (dwGroupType == WINNT_GROUP_EITHER) { // // - try both local and global groups if "group" for backward // compatability // - confirmed with cliffv (no global and local group under same // container in nt4 or nt5. So ok. hr = WinNTDeleteGlobalGroup( pObjectInfo->ComponentArray[1], pObjectInfo->ComponentArray[2] ); if (FAILED(hr)) { hr = WinNTDeleteLocalGroup( pObjectInfo->ComponentArray[1], pObjectInfo->ComponentArray[2] ); } } else if (dwGroupType == WINNT_GROUP_LOCAL) { hr = WinNTDeleteLocalGroup( pObjectInfo->ComponentArray[1], pObjectInfo->ComponentArray[2] ); } else if (dwGroupType == WINNT_GROUP_GLOBAL) { hr = WinNTDeleteGlobalGroup( pObjectInfo->ComponentArray[1], pObjectInfo->ComponentArray[2] ); } else { // // private funct'n -> must be ADSI own coding bug // ADsAssert(FALSE); hr = E_FAIL; } BAIL_ON_FAILURE(hr); break; default: RRETURN(E_FAIL); } error: RRETURN(hr); } HRESULT WinNTDeleteUser( POBJECTINFO pObjectInfo, const CWinNTCredentials& Credentials ) { WCHAR szHostServerName[MAX_PATH]; HRESULT hr; NET_API_STATUS nasStatus; if (!pObjectInfo) { RRETURN(E_FAIL); } switch (pObjectInfo->NumComponents) { case 2: hr = WinNTGetCachedDCName( pObjectInfo->ComponentArray[0], szHostServerName, Credentials.GetFlags() // we need a writeable dc ); BAIL_ON_FAILURE(hr); hr = WinNTDeleteUser( (szHostServerName +2), pObjectInfo->ComponentArray[1] ); BAIL_ON_FAILURE(hr); break; case 3: hr = WinNTDeleteUser( pObjectInfo->ComponentArray[1], pObjectInfo->ComponentArray[2] ); BAIL_ON_FAILURE(hr); break; default: RRETURN(E_FAIL); } error: RRETURN(hr); } HRESULT WinNTDeleteComputer( POBJECTINFO pObjectInfo, const CWinNTCredentials& Credentials ) { WCHAR szHostServerName[MAX_PATH]; HRESULT hr; NET_API_STATUS nasStatus; if (!pObjectInfo) { RRETURN(E_FAIL); } switch (pObjectInfo->NumComponents) { case 2: hr = WinNTGetCachedDCName( pObjectInfo->ComponentArray[0], szHostServerName, Credentials.GetFlags() // we need a writeable DC ); BAIL_ON_FAILURE(hr); hr = WinNTDeleteComputer( (szHostServerName +2), pObjectInfo->ComponentArray[1] ); BAIL_ON_FAILURE(hr); break; default: RRETURN(E_FAIL); } error: RRETURN(hr); }