|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997-2001.
//
// File: SelServc.cpp
//
// Contents: Implementation of Service Selection setup page
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "SelServc.h"
USE_HANDLE_MACROS("CERTMGR(SelServc.cpp)")
#ifdef _DEBUG
#ifndef ALPHA
#define new DEBUG_NEW
#endif
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CSelectServiceAccountPropPage property page
//IMPLEMENT_DYNCREATE(CSelectServiceAccountPropPage, CAutoDeletePropPage)
CSelectServiceAccountPropPage::CSelectServiceAccountPropPage( CString* pszManagedService, CString* pszManagedServiceDisplayName, const CString& szManagedMachine) : CAutoDeletePropPage(CSelectServiceAccountPropPage::IDD), m_pszManagedService (pszManagedService), m_pszManagedServiceDisplayName (pszManagedServiceDisplayName), m_szManagedMachine (szManagedMachine), m_savedManagedMachineName (_T("$uninitialized machine name$")) { ASSERT (pszManagedService); //{{AFX_DATA_INIT(CSelectServiceAccountPropPage)
//}}AFX_DATA_INIT
}
CSelectServiceAccountPropPage::~CSelectServiceAccountPropPage() { }
void CSelectServiceAccountPropPage::DoDataExchange(CDataExchange* pDX) { CAutoDeletePropPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSelectServiceAccountPropPage)
DDX_Control(pDX, IDC_ACCT_NAME, m_acctNameList); DDX_Control(pDX, IDC_INSTRUCTIONS, m_instructionsText); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSelectServiceAccountPropPage, CAutoDeletePropPage) //{{AFX_MSG_MAP(CSelectServiceAccountPropPage)
ON_CBN_SELCHANGE(IDC_ACCT_NAME, OnSelchangeAcctName) ON_WM_DESTROY() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSelectServiceAccountPropPage message handlers
BOOL CSelectServiceAccountPropPage::OnSetActive() { BOOL bResult = CAutoDeletePropPage::OnSetActive(); ASSERT (bResult);
if ( IsLocalComputername (m_szManagedMachine) ) { CString text; VERIFY (text.LoadString (IDS_SELECT_SERVICE_ON_LOCAL_MACHINE)); m_instructionsText.SetWindowText (text); } else { CString text; size_t len = m_instructionsText.GetWindowTextLength () + 1; m_instructionsText.GetWindowText (text.GetBufferSetLength ((int) len), (int) len); text.FormatMessage (text, m_szManagedMachine); m_instructionsText.SetWindowText (text); }
if ( m_savedManagedMachineName != m_szManagedMachine ) { GetParent ()->PostMessage (PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_DISABLEDFINISH); m_savedManagedMachineName = m_szManagedMachine; FreeDataPointers (); EnumerateServices (); } else { GetParent ()->PostMessage (PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_FINISH); }
return bResult; }
BOOL CSelectServiceAccountPropPage::OnInitDialog() { CAutoDeletePropPage::OnInitDialog(); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
HRESULT CSelectServiceAccountPropPage::EnumerateServices() { HRESULT hResult = S_OK; DWORD cbBytesNeeded = 0; DWORD entriesRead = 0; DWORD resumeHandle = 0; DWORD dwErr = 0; LPCWSTR lpMachineName = (LPCWSTR) (m_szManagedMachine);
SC_HANDLE hScManager = ::OpenSCManager (lpMachineName, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ENUMERATE_SERVICE); if ( hScManager ) { LPENUM_SERVICE_STATUS enumBuffer = new ENUM_SERVICE_STATUS[32]; DWORD cbBufSize = sizeof (ENUM_SERVICE_STATUS) * 32; BOOL bResult = FALSE;
if ( enumBuffer ) { int nIndex = 0; //
// Enumerate the ServiceStatus
//
dwErr = NO_ERROR;
do { bResult = ::EnumServicesStatus ( hScManager, SERVICE_WIN32, SERVICE_STATE_ALL, enumBuffer, cbBufSize, &cbBytesNeeded, &entriesRead, &resumeHandle); if ( bResult || GetLastError() == ERROR_MORE_DATA ) { for (UINT i = 0; i < entriesRead && SUCCEEDED (hResult); i++) { nIndex = m_acctNameList.AddString ( enumBuffer[i].lpDisplayName); ASSERT (nIndex >= 0); switch ( nIndex ) { case LB_ERR: hResult = E_FAIL; break;
case LB_ERRSPACE: hResult = E_OUTOFMEMORY; break;
default: nIndex = m_acctNameList.SetItemDataPtr (nIndex, new CString (enumBuffer[i].lpServiceName)); ASSERT (nIndex != LB_ERR); if ( nIndex == LB_ERR ) hResult = E_FAIL; break; } } } else { dwErr = GetLastError(); DisplaySystemError (m_hWnd, dwErr); hResult = HRESULT_FROM_WIN32 (dwErr); break; } } while (SUCCEEDED (hResult) && resumeHandle > 0);
int nCnt = m_acctNameList.GetCount (); ASSERT (nCnt != LB_ERR); if ( nCnt > 0 ) { nIndex = m_acctNameList.SetCurSel (0); ASSERT (nIndex != LB_ERR); if ( nIndex != LB_ERR ) { CopyCurrentString (); if ( m_pszManagedService && m_pszManagedService->IsEmpty () ) GetParent ()->PostMessage (PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_DISABLEDFINISH); else GetParent ()->PostMessage (PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_FINISH); } } delete [] enumBuffer; } else { hResult = E_OUTOFMEMORY; }
bResult = ::CloseServiceHandle (hScManager); ASSERT (bResult); if ( !bResult ) { dwErr = GetLastError (); DisplaySystemError (m_hWnd, dwErr); hResult = HRESULT_FROM_WIN32 (dwErr); } } else { dwErr = GetLastError (); DisplaySystemError (m_hWnd, dwErr); hResult = HRESULT_FROM_WIN32 (dwErr); /*
switch (dwErr) { case ERROR_ACCESS_DENIED: // The requested access was denied.
break;
case ERROR_DATABASE_DOES_NOT_EXIST: // The specified database does not exist.
break;
case ERROR_INVALID_PARAMETER: break;
case RPC_S_SERVER_UNAVAILABLE: break; } */ }
return hResult; }
void CSelectServiceAccountPropPage::OnSelchangeAcctName() { CopyCurrentString (); ASSERT (m_pszManagedService); if ( m_pszManagedService && m_pszManagedService->IsEmpty () ) GetParent ()->PostMessage (PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_DISABLEDFINISH); else GetParent ()->PostMessage (PSM_SETWIZBUTTONS, 0, PSWIZB_BACK | PSWIZB_FINISH); }
void CSelectServiceAccountPropPage::FreeDataPointers() { CString* pStr = 0; int nCnt = m_acctNameList.GetCount ();
for (int i = nCnt-1; i >= 0; i--) { pStr = (CString*) m_acctNameList.GetItemDataPtr (i); ASSERT (pStr != (CString*) LB_ERR); ASSERT (pStr); if ( pStr && pStr != (CString*) LB_ERR ) delete pStr; m_acctNameList.SetItemDataPtr (i, 0); m_acctNameList.DeleteString (i); } }
void CSelectServiceAccountPropPage::OnDestroy() { CAutoDeletePropPage::OnDestroy(); FreeDataPointers (); }
void CSelectServiceAccountPropPage::CopyCurrentString() { ASSERT (m_pszManagedService); if ( m_pszManagedService ) { int nIndex = m_acctNameList.GetCurSel (); ASSERT (LB_ERR != nIndex); if ( LB_ERR != nIndex ) { CString* pStr = (CString*) m_acctNameList.GetItemDataPtr (nIndex); ASSERT (pStr && pStr != (CString*) LB_ERR); if ( pStr && pStr != (CString*) LB_ERR ) *m_pszManagedService = *pStr;
m_acctNameList.GetText (nIndex, *m_pszManagedServiceDisplayName); } } }
|