windows-nt/Source/XPSP1/NT/net/rras/netsh/ras/domhndl.c
2020-09-26 16:20:57 +08:00

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);
}