/*++ 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); }