305 lines
7.5 KiB
C++
305 lines
7.5 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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);
|
||
|
}
|
||
|
}
|
||
|
}
|