450 lines
9.6 KiB
C
450 lines
9.6 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
domhndl.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Handlers for ras commands
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
pmay
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
//
|
||
|
// Common data to all domain api's
|
||
|
//
|
||
|
typedef struct _DOMAIN_API_DATA
|
||
|
{
|
||
|
PWCHAR pszDomain;
|
||
|
PWCHAR pszServer;
|
||
|
DWORD dwLevel;
|
||
|
|
||
|
} DOMAIN_API_DATA;
|
||
|
|
||
|
VOID
|
||
|
DomainFreeApiData(
|
||
|
IN DOMAIN_API_DATA* pData)
|
||
|
{
|
||
|
if (pData)
|
||
|
{
|
||
|
if (pData->pszDomain)
|
||
|
{
|
||
|
RutlFree(pData->pszDomain);
|
||
|
}
|
||
|
if (pData->pszServer)
|
||
|
{
|
||
|
RutlFree(pData->pszServer);
|
||
|
}
|
||
|
|
||
|
RutlFree(pData);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Generates an equivalent set of domain api data suitable for
|
||
|
// display
|
||
|
//
|
||
|
DWORD
|
||
|
DomainGeneratePrintableData(
|
||
|
IN DOMAIN_API_DATA* pSrc,
|
||
|
OUT DOMAIN_API_DATA** ppDst)
|
||
|
{
|
||
|
DOMAIN_API_DATA* pDst = NULL;
|
||
|
DOMAIN_CONTROLLER_INFO* pDomInfo = NULL;
|
||
|
DWORD dwErr = NO_ERROR;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
*ppDst = NULL;
|
||
|
|
||
|
pDst = (DOMAIN_API_DATA*) RutlAlloc(sizeof(DOMAIN_API_DATA), TRUE);
|
||
|
if (pDst is NULL)
|
||
|
{
|
||
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (pSrc->pszDomain is NULL)
|
||
|
{
|
||
|
// Get the default domain
|
||
|
//
|
||
|
dwErr = DsGetDcName(NULL, NULL, NULL, NULL, 0, &pDomInfo);
|
||
|
if (dwErr isnot NO_ERROR)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pDst->pszDomain = RutlStrDup(pDomInfo->DomainName);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pDst->pszDomain = RutlStrDup(pSrc->pszDomain);
|
||
|
}
|
||
|
|
||
|
if (pSrc->pszServer is NULL)
|
||
|
{
|
||
|
DWORD dwSize = 0;
|
||
|
|
||
|
// Find out the computer name length
|
||
|
//
|
||
|
GetComputerName(NULL, &dwSize);
|
||
|
dwErr = GetLastError();
|
||
|
dwSize = (dwSize + 1) * sizeof(WCHAR);
|
||
|
|
||
|
if ( (dwErr isnot NO_ERROR) && (dwErr isnot ERROR_BUFFER_OVERFLOW) )
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
dwErr = NO_ERROR;
|
||
|
|
||
|
pDst->pszServer = (PWCHAR) RutlAlloc(dwSize, TRUE);
|
||
|
if (pDst->pszServer is NULL)
|
||
|
{
|
||
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
GetComputerName(pDst->pszServer, &dwSize);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pDst->pszServer = RutlStrDup(pSrc->pszServer);
|
||
|
}
|
||
|
|
||
|
if (pDst->pszDomain is NULL)
|
||
|
{
|
||
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (pDst->pszServer is NULL)
|
||
|
{
|
||
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
*ppDst = pDst;
|
||
|
|
||
|
} while (FALSE);
|
||
|
|
||
|
// Cleanup
|
||
|
{
|
||
|
if (dwErr isnot NO_ERROR)
|
||
|
{
|
||
|
DomainFreeApiData(pDst);
|
||
|
}
|
||
|
if (pDomInfo)
|
||
|
{
|
||
|
NetApiBufferFree(pDomInfo);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Dumps domain related configuration
|
||
|
//
|
||
|
DWORD
|
||
|
DomainDumpConfig(
|
||
|
IN HANDLE hFile
|
||
|
)
|
||
|
{
|
||
|
DWORD dwErr = NO_ERROR;
|
||
|
BOOL bRegistered = FALSE;
|
||
|
|
||
|
//
|
||
|
// Record the registration of the server
|
||
|
//
|
||
|
dwErr = MprDomainQueryRasServer (NULL, NULL, &bRegistered);
|
||
|
if (dwErr is NO_ERROR)
|
||
|
{
|
||
|
DisplayMessageT(
|
||
|
(bRegistered) ? DMP_DOMAIN_REGISTER
|
||
|
: DMP_DOMAIN_UNREGISTER);
|
||
|
|
||
|
DisplayMessageT(MSG_NEWLINE);
|
||
|
}
|
||
|
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
DomainRegister(
|
||
|
IN DOMAIN_API_DATA* pApiData,
|
||
|
IN DOMAIN_API_DATA* pPrintData)
|
||
|
{
|
||
|
DWORD dwErr = NO_ERROR;
|
||
|
|
||
|
dwErr = MprDomainRegisterRasServer (
|
||
|
pApiData->pszDomain,
|
||
|
pApiData->pszServer,
|
||
|
TRUE);
|
||
|
|
||
|
if (dwErr is NO_ERROR)
|
||
|
{
|
||
|
DisplayMessage(
|
||
|
g_hModule,
|
||
|
MSG_DOMAIN_REGISTER_SUCCESS,
|
||
|
pPrintData->pszServer,
|
||
|
pPrintData->pszDomain);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DisplayMessage(
|
||
|
g_hModule,
|
||
|
MSG_DOMAIN_REGISTER_FAIL,
|
||
|
pPrintData->pszServer,
|
||
|
pPrintData->pszDomain);
|
||
|
}
|
||
|
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
DomainUnregister(
|
||
|
IN DOMAIN_API_DATA* pApiData,
|
||
|
IN DOMAIN_API_DATA* pPrintData)
|
||
|
{
|
||
|
DWORD dwErr = NO_ERROR;
|
||
|
|
||
|
dwErr = MprDomainRegisterRasServer (
|
||
|
pApiData->pszDomain,
|
||
|
pApiData->pszServer,
|
||
|
FALSE);
|
||
|
|
||
|
if (dwErr is NO_ERROR)
|
||
|
{
|
||
|
DisplayMessage(
|
||
|
g_hModule,
|
||
|
MSG_DOMAIN_UNREGISTER_SUCCESS,
|
||
|
pPrintData->pszServer,
|
||
|
pPrintData->pszDomain);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DisplayMessage(
|
||
|
g_hModule,
|
||
|
MSG_DOMAIN_UNREGISTER_FAIL,
|
||
|
pPrintData->pszServer,
|
||
|
pPrintData->pszDomain);
|
||
|
}
|
||
|
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
DomainShowRegistration(
|
||
|
IN DOMAIN_API_DATA* pApiData,
|
||
|
IN DOMAIN_API_DATA* pPrintData)
|
||
|
{
|
||
|
DWORD dwErr = NO_ERROR;
|
||
|
BOOL bYes = FALSE;
|
||
|
|
||
|
dwErr = MprDomainQueryRasServer (
|
||
|
pApiData->pszDomain,
|
||
|
pApiData->pszServer,
|
||
|
&bYes);
|
||
|
|
||
|
if (dwErr is NO_ERROR)
|
||
|
{
|
||
|
DisplayMessage(
|
||
|
g_hModule,
|
||
|
(bYes) ? MSG_DOMAIN_SHOW_REGISTERED
|
||
|
: MSG_DOMAIN_SHOW_UNREGISTERED,
|
||
|
pPrintData->pszServer,
|
||
|
pPrintData->pszDomain);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DisplayMessage(
|
||
|
g_hModule,
|
||
|
MSG_DOMAIN_SHOW_REGISTER_FAIL,
|
||
|
pPrintData->pszServer,
|
||
|
pPrintData->pszDomain);
|
||
|
}
|
||
|
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Registers/unregisters an W2K machine as a ras server in the
|
||
|
// active directory of the given domain.
|
||
|
//
|
||
|
DWORD
|
||
|
HandleDomainRegistration(
|
||
|
IN OUT LPWSTR *ppwcArguments,
|
||
|
IN DWORD dwCurrentIndex,
|
||
|
IN DWORD dwArgCount,
|
||
|
IN BOOL *pbDone,
|
||
|
IN DWORD dwMode // 0 = register, 1 = unregister, 2 = show
|
||
|
)
|
||
|
{
|
||
|
DWORD dwErr = NO_ERROR;
|
||
|
DOMAIN_API_DATA *pData = NULL, *pPrint = NULL;
|
||
|
RASMON_CMD_ARG pArgs[] =
|
||
|
{
|
||
|
{
|
||
|
RASMONTR_CMD_TYPE_STRING,
|
||
|
{TOKEN_DOMAIN, FALSE, FALSE},
|
||
|
NULL,
|
||
|
0,
|
||
|
NULL
|
||
|
},
|
||
|
|
||
|
{
|
||
|
RASMONTR_CMD_TYPE_STRING,
|
||
|
{TOKEN_SERVER, FALSE, FALSE},
|
||
|
NULL,
|
||
|
0,
|
||
|
NULL
|
||
|
}
|
||
|
};
|
||
|
|
||
|
do
|
||
|
{
|
||
|
// Allocate data structure
|
||
|
//
|
||
|
pData = (DOMAIN_API_DATA*) RutlAlloc(sizeof(DOMAIN_API_DATA), TRUE);
|
||
|
if (pData == NULL)
|
||
|
{
|
||
|
dwErr = ERROR_NOT_ENOUGH_MEMORY;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Parse
|
||
|
//
|
||
|
dwErr = RutlParse(
|
||
|
ppwcArguments,
|
||
|
dwCurrentIndex,
|
||
|
dwArgCount,
|
||
|
NULL,
|
||
|
pArgs,
|
||
|
sizeof(pArgs)/sizeof(*pArgs));
|
||
|
BREAK_ON_DWERR(dwErr);
|
||
|
|
||
|
// Get the arguments
|
||
|
//
|
||
|
pData->pszDomain = RASMON_CMD_ARG_GetPsz(&pArgs[0]);
|
||
|
pData->pszServer = RASMON_CMD_ARG_GetPsz(&pArgs[1]);
|
||
|
|
||
|
//
|
||
|
// Generate printable data
|
||
|
//
|
||
|
dwErr = DomainGeneratePrintableData(
|
||
|
pData,
|
||
|
&pPrint);
|
||
|
BREAK_ON_DWERR(dwErr);
|
||
|
|
||
|
// Register
|
||
|
//
|
||
|
if (dwMode == 0)
|
||
|
{
|
||
|
dwErr = DomainRegister(
|
||
|
pData,
|
||
|
pPrint);
|
||
|
}
|
||
|
else if (dwMode == 1)
|
||
|
{
|
||
|
dwErr = DomainUnregister(
|
||
|
pData,
|
||
|
pPrint);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwErr = DomainShowRegistration(
|
||
|
pData,
|
||
|
pPrint);
|
||
|
}
|
||
|
BREAK_ON_DWERR(dwErr);
|
||
|
|
||
|
} while (FALSE);
|
||
|
|
||
|
// Cleanup
|
||
|
{
|
||
|
DomainFreeApiData(pData);
|
||
|
DomainFreeApiData(pPrint);
|
||
|
}
|
||
|
|
||
|
return dwErr;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Registers a W2K server as ras server in active directory
|
||
|
// of the given domain.
|
||
|
//
|
||
|
DWORD
|
||
|
HandleDomainRegister(
|
||
|
IN LPCWSTR pwszMachine,
|
||
|
IN OUT LPWSTR *ppwcArguments,
|
||
|
IN DWORD dwCurrentIndex,
|
||
|
IN DWORD dwArgCount,
|
||
|
IN DWORD dwFlags,
|
||
|
IN LPCVOID pvData,
|
||
|
OUT BOOL *pbDone
|
||
|
)
|
||
|
{
|
||
|
return HandleDomainRegistration(
|
||
|
ppwcArguments,
|
||
|
dwCurrentIndex,
|
||
|
dwArgCount,
|
||
|
pbDone,
|
||
|
0);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Unregisters a W2K server as ras server in active directory
|
||
|
// of the given domain.
|
||
|
//
|
||
|
DWORD
|
||
|
HandleDomainUnregister(
|
||
|
IN LPCWSTR pwszMachine,
|
||
|
IN OUT LPWSTR *ppwcArguments,
|
||
|
IN DWORD dwCurrentIndex,
|
||
|
IN DWORD dwArgCount,
|
||
|
IN DWORD dwFlags,
|
||
|
IN LPCVOID pvData,
|
||
|
OUT BOOL *pbDone
|
||
|
)
|
||
|
{
|
||
|
return HandleDomainRegistration(
|
||
|
ppwcArguments,
|
||
|
dwCurrentIndex,
|
||
|
dwArgCount,
|
||
|
pbDone,
|
||
|
1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Shows whether the given computer is registered
|
||
|
// in the given domain
|
||
|
//
|
||
|
DWORD
|
||
|
HandleDomainShowRegistration(
|
||
|
IN LPCWSTR pwszMachine,
|
||
|
IN OUT LPWSTR *ppwcArguments,
|
||
|
IN DWORD dwCurrentIndex,
|
||
|
IN DWORD dwArgCount,
|
||
|
IN DWORD dwFlags,
|
||
|
IN LPCVOID pvData,
|
||
|
OUT BOOL *pbDone
|
||
|
)
|
||
|
{
|
||
|
return HandleDomainRegistration(
|
||
|
ppwcArguments,
|
||
|
dwCurrentIndex,
|
||
|
dwArgCount,
|
||
|
pbDone,
|
||
|
2);
|
||
|
}
|
||
|
|