666 lines
14 KiB
C++
666 lines
14 KiB
C++
#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);
|
|
}
|