//+-------------------------------------------------------------------------- // // Copyright (c) 1997-1999 Microsoft Corporation // // File: upg.cpp // // Contents: // // History: // //--------------------------------------------------------------------------- #include "upg.h" #include //---------------------------------------------------- // // Global variables // // TCHAR g_szOdbcDsn[128]=NT4LSERVER_DEFAULT_DSN; // ODBC DSN TCHAR g_szOdbcUser[128]=NT4LSERVER_DEFAULT_USER; // ODBC User Name TCHAR g_szOdbcPwd[128]=NT4LSERVER_DEFAULT_PWD; // ODBC Password TCHAR g_szMdbFile[MAX_PATH+1]; //-------------------------------------------------------------------------- DWORD GetNT4DbConfig( LPTSTR pszDsn, LPTSTR pszUserName, LPTSTR pszPwd, LPTSTR pszMdbFile ) /*++ ++*/ { HKEY hKey = NULL; DWORD dwStatus = ERROR_SUCCESS; TCHAR szOdbcDsn[128]=NT4LSERVER_DEFAULT_DSN; // ODBC DSN TCHAR szOdbcUser[128]=NT4LSERVER_DEFAULT_USER; // ODBC User Name TCHAR szOdbcPwd[128]=NT4LSERVER_DEFAULT_PWD; // ODBC Password TCHAR szMdbFile[MAX_PATH+1]; DWORD dwBuffer=0; PBYTE pbData = NULL; DWORD cbData = 0; BOOL bSuccess; // // Open NT4 license server specific registry key // dwStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE, NT4LSERVER_REGKEY, 0, KEY_ALL_ACCESS, &hKey ); if(dwStatus != ERROR_SUCCESS) { dwStatus = ERROR_INVALID_NT4_SETUP; goto cleanup; } // // Load ODBC DSN and User name from registry, // ignore error return and use default value. // dwBuffer = sizeof(szOdbcDsn); dwStatus = RegQueryValueEx( hKey, NT4LSERVER_PARAMETERS_DSN, NULL, NULL, (LPBYTE)szOdbcDsn, &dwBuffer ); if(dwStatus == ERROR_SUCCESS && pszDsn) { lstrcpy(pszDsn, szOdbcDsn); } dwBuffer = sizeof(szOdbcUser); dwStatus = RegQueryValueEx( hKey, NT4LSERVER_PARAMETERS_USER, NULL, NULL, (LPBYTE)szOdbcUser, &dwBuffer ); if(dwStatus == ERROR_SUCCESS && pszUserName) { lstrcpy(pszUserName, szOdbcUser); } // // Load database password from LSA // dwStatus = RetrieveKey( LSERVER_LSA_PASSWORD_KEYNAME, &pbData, &cbData ); #ifndef PRIVATE_DBG if(dwStatus != ERROR_SUCCESS) { // // Invalid NT4 license server setup or hydra beta2 // license server which we don't support. // dwStatus = ERROR_INVALID_NT4_SETUP; goto cleanup; } #endif dwStatus = ERROR_SUCCESS; memset(szOdbcPwd, 0, sizeof(szOdbcPwd)); memcpy( (PBYTE)szOdbcPwd, pbData, min(cbData, sizeof(szOdbcPwd) - sizeof(TCHAR)) ); if(pszPwd != NULL) { lstrcpy(pszPwd, szOdbcPwd); } // // Verify data source is properly installed // bSuccess = IsDataSourceInstalled( szOdbcDsn, ODBC_SYSTEM_DSN, szMdbFile, MAX_PATH ); if(bSuccess == FALSE) { dwStatus = ERROR_INVALID_NT4_SETUP; goto cleanup; } if(pszMdbFile != NULL) { _tcscpy(pszMdbFile, szMdbFile); } cleanup: if(hKey != NULL) { RegCloseKey(hKey); } if(pbData != NULL) { LocalFree(pbData); } return dwStatus; } //-------------------------------------------------------------------------- DWORD DeleteNT4ODBCDataSource() /*++ --*/ { BOOL bSuccess; DWORD dwStatus = ERROR_SUCCESS; // // Get Hydra 4 DB configuration, make sure // data source is properly config. // dwStatus = GetNT4DbConfig( g_szOdbcDsn, g_szOdbcUser, g_szOdbcPwd, g_szMdbFile ); if(dwStatus == ERROR_SUCCESS) { bSuccess = ConfigDataSource( NULL, FALSE, _TEXT(SZACCESSDRIVERNAME), g_szOdbcDsn, g_szOdbcUser, g_szOdbcPwd, g_szMdbFile ); if(bSuccess == FALSE) { dwStatus = ERROR_DELETE_ODBC_DSN; } } return dwStatus; } //-------------------------------------------------------------------------- #define LSERVER_SOFTWARE_REGBASE \ _TEXT("SOFTWARE\\Microsoft\\") _TEXT(SZSERVICENAME) #define LSERVER_CERTIFICATE_STORE _TEXT("Certificates") #define LSERVER_SERVER_CERTIFICATE_REGKEY \ LSERVER_SOFTWARE_REGBASE _TEXT("\\") LSERVER_CERTIFICATE_STORE #define LSERVER_CLIENT_CERTIFICATE_ISSUER _TEXT("Parm0") #define LSERVER_SIGNATURE_CERT_KEY _TEXT("Parm1") #define LSERVER_EXCHANGE_CERT_KEY _TEXT("Parm2") void CleanLicenseServerSecret() /*++ --*/ { DWORD dwStatus = ERROR_SUCCESS; HKEY hKey = NULL; // // Wipe out SPK in LSA // dwStatus = StoreKey( LSERVER_LSA_LSERVERID, (PBYTE) NULL, 0 ); dwStatus = StoreKey( LSERVER_LSA_LASTRUN, (PBYTE) NULL, 0 ); dwStatus = StoreKey( LSERVER_LSA_PRIVATEKEY_EXCHANGE, (PBYTE) NULL, 0 ); dwStatus = StoreKey( LSERVER_LSA_PRIVATEKEY_SIGNATURE, (PBYTE) NULL, 0 ); dwStatus=RegOpenKeyEx( HKEY_LOCAL_MACHINE, LSERVER_SERVER_CERTIFICATE_REGKEY, 0, KEY_ALL_ACCESS, &hKey ); if(dwStatus == ERROR_SUCCESS) { // // Ignore error RegDeleteValue( hKey, LSERVER_SIGNATURE_CERT_KEY ); RegDeleteValue( hKey, LSERVER_EXCHANGE_CERT_KEY ); RegDeleteValue( hKey, LSERVER_CLIENT_CERTIFICATE_ISSUER ); } if(hKey != NULL) { RegCloseKey(hKey); } return; } DWORD MigrateOneSecret(PWCHAR wszSecretName, PWCHAR wszSecretNameOld) /*++ --*/ { DWORD dwErr = ERROR_SUCCESS; PBYTE pbValue = NULL; DWORD cbValue = 0; dwErr = RetrieveKey(wszSecretNameOld,&pbValue,&cbValue); if (dwErr == ERROR_SUCCESS) { dwErr = StoreKey(wszSecretName, pbValue, cbValue ); if (dwErr == ERROR_SUCCESS) { StoreKey(wszSecretNameOld, (PBYTE) NULL, 0 ); } else { goto done; } } else if (dwErr == ERROR_FILE_NOT_FOUND) { dwErr = ERROR_SUCCESS; } else { goto done; } done: if (NULL != pbValue) { LocalFree(pbValue); } return dwErr; } DWORD MigrateLsaSecrets() /*++ --*/ { DWORD dwErr = ERROR_SUCCESS; dwErr = MigrateOneSecret(LSERVER_LSA_PASSWORD_KEYNAME, LSERVER_LSA_PASSWORD_KEYNAME_OLD); if (dwErr != ERROR_SUCCESS) { goto done; } dwErr = MigrateOneSecret(LSERVER_LSA_LASTRUN, LSERVER_LSA_LASTRUN_OLD); if (dwErr != ERROR_SUCCESS) { goto done; } dwErr = MigrateOneSecret(LSERVER_LSA_SETUPID, LSERVER_LSA_SETUPID_OLD); if (dwErr != ERROR_SUCCESS) { goto done; } dwErr = MigrateOneSecret(LSERVER_LSA_PRIVATEKEY_SIGNATURE, LSERVER_LSA_PRIVATEKEY_SIGNATURE_OLD); if (dwErr != ERROR_SUCCESS) { goto done; } dwErr = MigrateOneSecret(LSERVER_LSA_PRIVATEKEY_EXCHANGE, LSERVER_LSA_PRIVATEKEY_EXCHANGE_OLD); if (dwErr != ERROR_SUCCESS) { goto done; } dwErr = MigrateOneSecret(LSERVER_LSA_LSERVERID, LSERVER_LSA_LSERVERID_OLD); if (dwErr != ERROR_SUCCESS) { goto done; } done: return dwErr; }