You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1164 lines
39 KiB
1164 lines
39 KiB
/*---------------------------------------------------------------------------
|
|
File: AgentDetailDlg.cpp
|
|
|
|
Comments: This dialog shows the status of the agent on a single machine:
|
|
It can work in one of 3 ways:
|
|
1) COM connection to the running agent on the local machine
|
|
2) DCOM connection to a running agent on another machine (this is done
|
|
with help from the agent service)
|
|
3) For a remote agent that has finished, it can show the final stats,
|
|
as recorded in the agent's result file.
|
|
|
|
(c) Copyright 1999, Mission Critical Software, Inc., All Rights Reserved
|
|
Proprietary and confidential to Mission Critical Software, Inc.
|
|
|
|
REVISION LOG ENTRY
|
|
Revision By: Christy Boles
|
|
|
|
---------------------------------------------------------------------------
|
|
*/// AgentDetail.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include "DetDlg.h"
|
|
|
|
#include "Common.hpp"
|
|
#include "AgRpcUtl.h"
|
|
#include "Monitor.h"
|
|
#include "ResStr.h"
|
|
|
|
//#include "..\AgtSvc\AgSvc.h"
|
|
#include "AgSvc.h"
|
|
#include "AgSvc_c.c"
|
|
|
|
//#import "\bin\McsEADCTAgent.tlb" no_namespace , named_guids
|
|
//#import "\bin\McsVarSetMin.tlb" no_namespace
|
|
|
|
//#import "Engine.tlb" no_namespace, named_guids //already #imported via DetDlg.h
|
|
#import "VarSet.tlb" no_namespace rename("property", "aproperty")
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
HWND gSubWnd = NULL;
|
|
BOOL bDetailDone = FALSE;
|
|
int detailInterval = 0;
|
|
extern BOOL gbCancelled;
|
|
|
|
TCHAR* GetSystemDirectoryHelper()
|
|
{
|
|
const DWORD iSize = GetSystemDirectory(NULL, 0);
|
|
TCHAR* buffer = NULL;
|
|
DWORD dwTemp = 0;
|
|
|
|
if(iSize == 0)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
buffer = new TCHAR[iSize + _tcslen(__TEXT("\\"))]; // iSize includes the NULL terminiator
|
|
if(!buffer)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
dwTemp = GetSystemDirectory(buffer, iSize);
|
|
if(dwTemp == 0)
|
|
{
|
|
if(buffer)
|
|
{
|
|
delete [] buffer;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
_tcscat(buffer, __TEXT("\\"));
|
|
|
|
return buffer;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAgentDetailDlg dialog
|
|
|
|
|
|
CAgentDetailDlg::CAgentDetailDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CAgentDetailDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CAgentDetailDlg)
|
|
m_Current = _T("");
|
|
m_Status = _T("");
|
|
m_FilesChanged = _T("0");
|
|
m_FilesExamined = _T("0");
|
|
m_FilesUnchanged = _T("0");
|
|
m_DirectoriesChanged = _T("0");
|
|
m_DirectoriesExamined = _T("0");
|
|
m_DirectoriesUnchanged = _T("0");
|
|
m_SharesChanged = _T("0");
|
|
m_SharesExamined = _T("0");
|
|
m_SharesUnchanged = _T("0");
|
|
m_Operation = _T("");
|
|
m_RefreshRate = _T("5");
|
|
//}}AFX_DATA_INIT
|
|
m_DirectoryLabelText.LoadString(IDS_DirectoriesLabel);
|
|
m_FilesLabelText.LoadString(IDS_FilesLabel);
|
|
m_SharesLabelText.LoadString(IDS_SharesLabel);
|
|
m_ChangedLabel.LoadString(IDS_ChangedLabel);
|
|
m_ExaminedLabel.LoadString(IDS_ExaminedLabel);
|
|
m_UnchangedLabel.LoadString(IDS_UnchangedLabel);
|
|
m_pNode = NULL;
|
|
detailInterval = _wtoi(m_RefreshRate);
|
|
m_bCoInitialized = FALSE;
|
|
m_format = 0;
|
|
m_AgentAlive = FALSE;
|
|
m_StatusUnknown = FALSE;
|
|
m_hBinding = 0;
|
|
m_pStats = NULL;
|
|
m_bGatheringInfo = FALSE;
|
|
m_bAutoHide = FALSE;
|
|
m_bAutoClose = FALSE;
|
|
m_bAlwaysEnableClose = TRUE;
|
|
m_LogFileIsValid = TRUE;
|
|
}
|
|
|
|
ULONG __stdcall RefreshThread(void * arg)
|
|
{
|
|
do {
|
|
PostMessage(gSubWnd,DCT_DETAIL_REFRESH,NULL,NULL);
|
|
Sleep(detailInterval*1000);
|
|
}
|
|
while (! bDetailDone);
|
|
return 0;
|
|
}
|
|
void CAgentDetailDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAgentDetailDlg)
|
|
DDX_Control(pDX, IDC_STOPAGENT, m_StopAgentButton);
|
|
DDX_Control(pDX, IDC_BTNREFRESH, m_RefreshButton);
|
|
DDX_Control(pDX, IDC_VIEW_LOG, m_ViewLogButton);
|
|
DDX_Control(pDX, IDC_PLUG_IN_RESULTS, m_PlugInButton);
|
|
DDX_Control(pDX, IDOK, m_OKButton);
|
|
DDX_Control(pDX, IDC_UnchangedLabel, m_UnchangedLabelStatic);
|
|
DDX_Control(pDX, IDC_SharesLabel, m_SharesStatic);
|
|
DDX_Control(pDX, IDC_FilesLabel, m_FilesStatic);
|
|
DDX_Control(pDX, IDC_ExaminedLabel, m_ExaminedStatic);
|
|
DDX_Control(pDX, IDC_DirectoriesLabel, m_DirStatic);
|
|
DDX_Control(pDX, IDC_ChangedLabel, m_ChangedStatic);
|
|
DDX_Text(pDX, IDC_CURRENT, m_Current);
|
|
DDX_Text(pDX, IDC_STATUS, m_Status);
|
|
DDX_Text(pDX, IDC_FilesChanged, m_FilesChanged);
|
|
DDX_Text(pDX, IDC_FilesExamined, m_FilesExamined);
|
|
DDX_Text(pDX, IDC_FilesU, m_FilesUnchanged);
|
|
DDX_Text(pDX, IDC_DirsChanged, m_DirectoriesChanged);
|
|
DDX_Text(pDX, IDC_DirsExamined, m_DirectoriesExamined);
|
|
DDX_Text(pDX, IDC_DirsU, m_DirectoriesUnchanged);
|
|
DDX_Text(pDX, IDC_SharesChanged, m_SharesChanged);
|
|
DDX_Text(pDX, IDC_SharesExamined, m_SharesExamined);
|
|
DDX_Text(pDX, IDC_SharesU, m_SharesUnchanged);
|
|
DDX_Text(pDX, IDC_DirectoriesLabel, m_DirectoryLabelText);
|
|
DDX_Text(pDX, IDC_FilesLabel, m_FilesLabelText);
|
|
DDX_Text(pDX, IDC_OPERATION, m_Operation);
|
|
DDX_Text(pDX, IDC_SharesLabel, m_SharesLabelText);
|
|
DDX_Text(pDX, IDC_ChangedLabel, m_ChangedLabel);
|
|
DDX_Text(pDX, IDC_ExaminedLabel, m_ExaminedLabel);
|
|
DDX_Text(pDX, IDC_UnchangedLabel, m_UnchangedLabel);
|
|
DDX_Text(pDX, IDC_EDIT2, m_RefreshRate);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CAgentDetailDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CAgentDetailDlg)
|
|
ON_WM_NCPAINT()
|
|
ON_BN_CLICKED(IDC_BTNREFRESH, OnRefresh)
|
|
ON_EN_CHANGE(IDC_EDIT2, OnChangeEdit2)
|
|
ON_BN_CLICKED(IDC_STOPAGENT, OnStopAgent)
|
|
ON_BN_CLICKED(IDC_VIEW_LOG, OnViewLog)
|
|
ON_BN_CLICKED(IDC_PLUG_IN_RESULTS, OnPlugInResults)
|
|
ON_WM_CLOSE()
|
|
//}}AFX_MSG_MAP
|
|
ON_MESSAGE(DCT_DETAIL_REFRESH, DoRefresh)
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAgentDetailDlg message handlers
|
|
|
|
BOOL CAgentDetailDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
HRESULT hr = CoInitialize(NULL);
|
|
if (SUCCEEDED(hr))
|
|
m_bCoInitialized = TRUE;
|
|
|
|
CString title;
|
|
if ( m_JobGuid.length() )
|
|
{
|
|
// connect to local agent
|
|
title.LoadString(IDS_PROGRESS_TITLE);
|
|
}
|
|
else
|
|
{
|
|
// connect to agent service on remote machine
|
|
|
|
if ( ! m_pNode )
|
|
{
|
|
// if not auto closing display message box
|
|
|
|
if (!m_bAutoClose)
|
|
{
|
|
CString message;
|
|
message.LoadString(IDS_ServerNotFound);
|
|
MessageBox(message);
|
|
}
|
|
OnOK();
|
|
}
|
|
m_ServerName = m_pNode->GetServer();
|
|
title.FormatMessage(IDS_ServerAgentProgressTitle,m_ServerName);
|
|
}
|
|
|
|
SetWindowText(title);
|
|
UpdateData(FALSE);
|
|
|
|
//If not AR operation, set the flag to enable the close button
|
|
if (m_format != 1)
|
|
m_bAlwaysEnableClose = TRUE;
|
|
else
|
|
m_bAlwaysEnableClose = FALSE;
|
|
|
|
switch (m_format)
|
|
{
|
|
// set the format to -1 to force a change
|
|
case -1: m_format = -2; SetupOtherFormat(); break;
|
|
case 0: m_format = -2; SetupFSTFormat();break;
|
|
case 1: m_format = -2; SetupAcctReplFormat(); break;
|
|
case 2: m_format = -2; SetupESTFormat(); break;
|
|
};
|
|
|
|
gSubWnd = m_hWnd;
|
|
if ( m_pStats && (m_format>0) )
|
|
{
|
|
bDetailDone = TRUE;
|
|
GetDlgItem(IDC_BTNREFRESH)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_REFRESH_LABEL)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_STOPAGENT)->EnableWindow(FALSE);
|
|
m_OKButton.EnableWindow(TRUE);
|
|
// the agent has finished, show files, directories, and shares
|
|
m_FilesExamined.Format(L"%ld",m_pStats->filesExamined);
|
|
m_FilesChanged.Format(L"%ld",m_pStats->filesChanged);
|
|
m_FilesUnchanged.Format(L"%ld",m_pStats->filesUnchanged);
|
|
|
|
m_DirectoriesExamined.Format(L"%ld",m_pStats->directoriesExamined);
|
|
m_DirectoriesChanged.Format(L"%ld",m_pStats->directoriesChanged);
|
|
m_DirectoriesUnchanged.Format(L"%ld",m_pStats->directoriesUnchanged);
|
|
|
|
m_SharesExamined.Format(L"%ld",m_pStats->sharesExamined);
|
|
m_SharesChanged.Format(L"%ld",m_pStats->sharesChanged);
|
|
m_SharesUnchanged.Format(L"%ld",m_pStats->sharesUnchanged);
|
|
|
|
m_Status.LoadString(IDS_StatusCompleted);
|
|
|
|
if ( m_PlugInText.GetLength() )
|
|
{
|
|
//Permanently hide the plug-in button, since our plug-ins
|
|
// don't show any useful text
|
|
// m_PlugInButton.ShowWindow(SW_SHOW);
|
|
}
|
|
UpdateData(FALSE);
|
|
|
|
// if auto closing dialog
|
|
|
|
if (m_bAutoClose)
|
|
{
|
|
OnOK();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
bDetailDone = FALSE;
|
|
m_hBinding = NULL;
|
|
|
|
DWORD threadID;
|
|
HANDLE h = CreateThread(NULL,0,&RefreshThread,NULL,0,&threadID);
|
|
|
|
CloseHandle(h);
|
|
|
|
//hide the close button until the agent is done or stopped unless the flag is set
|
|
//due to running this dialog for account replication
|
|
if (m_bAlwaysEnableClose)
|
|
m_OKButton.EnableWindow(TRUE);
|
|
else
|
|
m_OKButton.EnableWindow(FALSE);
|
|
}
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
DWORD
|
|
DoRpcQuery(
|
|
HANDLE hBinding, // in - handle to RPC binding
|
|
LPUNKNOWN * ppUnk // out- pointer to remote agent COM object
|
|
)
|
|
{
|
|
DWORD rc = 0;
|
|
|
|
RpcTryExcept
|
|
{
|
|
rc = EaxcQueryInterface(hBinding,ppUnk);
|
|
}
|
|
RpcExcept(1)
|
|
{
|
|
rc = RpcExceptionCode();
|
|
}
|
|
RpcEndExcept
|
|
|
|
if ( rc )
|
|
{
|
|
(*ppUnk ) = NULL;
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
void CAgentDetailDlg::SetupAcctReplFormat()
|
|
{
|
|
// Changes the labels to reflect pertinent information when copying accounts
|
|
UpdateData(TRUE);
|
|
if ( m_format != 1 )
|
|
{
|
|
m_ChangedLabel.LoadString(IDS_AccountCopiedLabel);
|
|
m_UnchangedLabel.LoadString(IDS_AccountErrorsLabel);
|
|
|
|
m_FilesLabelText.LoadString(IDS_AccountUsersLabel);
|
|
m_DirectoryLabelText.LoadString(IDS_AccountGroupsLabel);
|
|
m_SharesLabelText.LoadString(IDS_AccountComputersLabel);
|
|
|
|
m_format = 1;
|
|
}
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CAgentDetailDlg::SetupFSTFormat()
|
|
{
|
|
// Changes the labels to reflect pertinent information when translating security
|
|
UpdateData(TRUE);
|
|
if ( m_format != 0 )
|
|
{
|
|
if ( m_bGatheringInfo )
|
|
{
|
|
m_ChangedLabel.LoadString(IDS_Affected);
|
|
m_UnchangedLabel.LoadString(IDS_Unaffected);
|
|
}
|
|
else
|
|
{
|
|
m_ChangedLabel.LoadString(IDS_ChangedLabel);
|
|
m_UnchangedLabel.LoadString(IDS_UnchangedLabel);
|
|
}
|
|
m_FilesLabelText.LoadString(IDS_FilesLabel);
|
|
m_DirectoryLabelText.LoadString(IDS_DirectoriesLabel);
|
|
m_SharesLabelText.LoadString(IDS_SharesLabel);
|
|
m_format = 0;
|
|
}
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CAgentDetailDlg::SetupESTFormat()
|
|
{
|
|
// Changes the labels to reflect pertinent information when translating exchange security
|
|
UpdateData(TRUE);
|
|
if ( m_format != 2 )
|
|
{
|
|
m_ChangedLabel.LoadString(IDS_ChangedLabel);
|
|
m_UnchangedLabel.LoadString(IDS_UnchangedLabel);
|
|
m_FilesLabelText.LoadString(IDS_MailboxesLabel);
|
|
m_DirectoryLabelText.Empty();
|
|
m_SharesLabelText.Empty();
|
|
|
|
m_format = 2;
|
|
}
|
|
UpdateData(FALSE);
|
|
|
|
}
|
|
|
|
void CAgentDetailDlg::SetupOtherFormat()
|
|
{
|
|
// Changes the labels to reflect pertinent information when translating exchange security
|
|
UpdateData(TRUE);
|
|
if ( m_format != -1 )
|
|
{
|
|
m_ExaminedLabel.Empty();
|
|
m_ChangedLabel.Empty();
|
|
m_UnchangedLabel.Empty();
|
|
m_FilesLabelText.Empty();
|
|
m_DirectoryLabelText.Empty();
|
|
m_SharesLabelText.Empty();
|
|
|
|
m_FilesExamined.Empty();
|
|
m_DirectoriesExamined.Empty();
|
|
m_SharesExamined.Empty();
|
|
m_FilesChanged.Empty();
|
|
m_DirectoriesChanged.Empty();
|
|
m_SharesChanged.Empty();
|
|
m_FilesUnchanged.Empty();
|
|
m_DirectoriesUnchanged.Empty();
|
|
m_SharesUnchanged.Empty();
|
|
|
|
m_format = -1;
|
|
}
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
|
|
void CAgentDetailDlg::OnRefresh()
|
|
{
|
|
DWORD rc = 0;
|
|
HRESULT hr = S_OK;
|
|
WCHAR * sBinding = NULL;
|
|
IUnknown * pUnk = NULL;
|
|
IVarSetPtr pVarSet;
|
|
_bstr_t jobID;
|
|
|
|
if (m_bCoInitialized)
|
|
{
|
|
|
|
try {
|
|
if ( m_pNode )
|
|
{
|
|
jobID = m_pNode->GetJobID();
|
|
}
|
|
else
|
|
{
|
|
jobID = m_JobGuid;
|
|
}
|
|
|
|
m_AgentAlive = FALSE;
|
|
m_StatusUnknown = FALSE;
|
|
|
|
UpdateData(TRUE);
|
|
|
|
if ( m_pAgent == NULL )
|
|
{
|
|
if ( m_pNode )
|
|
{
|
|
|
|
WCHAR server[MAX_PATH];
|
|
server[0] = L'\\';
|
|
server[1] = L'\\';
|
|
UStrCpy(server+2,m_pNode->GetServer());
|
|
rc = EaxBindCreate(server,&m_hBinding,&sBinding,TRUE);
|
|
if ( ! rc )
|
|
{
|
|
pUnk = NULL;
|
|
rc = DoRpcQuery(m_hBinding,&pUnk);
|
|
if ( (!rc) && pUnk )
|
|
{
|
|
try {
|
|
m_pAgent = pUnk;
|
|
}
|
|
catch(_com_error * e)
|
|
{
|
|
m_StatusUnknown = TRUE;
|
|
|
|
// if not auto closing display message box
|
|
if (!m_bAutoClose)
|
|
{
|
|
MessageBox(e->Description());
|
|
}
|
|
}
|
|
catch(...)
|
|
{
|
|
pUnk = NULL;
|
|
}
|
|
if ( pUnk )
|
|
pUnk->Release();
|
|
}
|
|
else
|
|
{
|
|
if ( rc == RPC_S_SERVER_UNAVAILABLE )
|
|
{
|
|
m_Status.LoadString(IDS_AgentNotRunning);
|
|
}
|
|
else if ( rc == E_NOTIMPL )
|
|
{
|
|
m_StatusUnknown = TRUE;
|
|
m_Status.LoadString(IDS_CantMonitorOnNt351);
|
|
}
|
|
else
|
|
{
|
|
m_StatusUnknown = TRUE;
|
|
m_Status.LoadString(IDS_CannotConnectToAgent);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_StatusUnknown = TRUE;
|
|
m_Status.LoadString(IDS_RPCBindFailed);
|
|
}
|
|
if ( m_StatusUnknown || rc )
|
|
{
|
|
// if we couldn't connect to the agent, check to see if there is a result file
|
|
// we can get our data from instead
|
|
BOOL bNoMoreRefresh = FALSE;
|
|
if (m_pNode->HasFailed() && !m_pNode->IsInstalled())
|
|
{
|
|
bNoMoreRefresh = TRUE;
|
|
m_Status.LoadString(IDS_Status_InstallFailed);
|
|
UpdateData(FALSE);
|
|
}
|
|
else if (m_pNode->IsInstalled() && m_pNode->HasFailed())
|
|
{
|
|
bNoMoreRefresh = TRUE;
|
|
m_Status.LoadString(IDS_Status_DidNotStart);
|
|
UpdateData(FALSE);
|
|
}
|
|
else if (m_pNode->IsFinished() && *m_pNode->GetJobFile() && m_pNode->IsResultPullingTried()
|
|
&& m_pNode->HasResult())
|
|
{
|
|
DetailStats detailStats;
|
|
WCHAR directory[MAX_PATH];
|
|
WCHAR filename[MAX_PATH];
|
|
CString plugInText;
|
|
|
|
gData.GetResultDir(directory);
|
|
|
|
memset(&detailStats,0,(sizeof detailStats));
|
|
|
|
swprintf(filename,GET_STRING(IDS_AgentResultFileFmt),m_pNode->GetJobFile());
|
|
if ( ReadResults(m_pNode,directory,filename,&detailStats,plugInText,FALSE) )
|
|
{
|
|
SetStats(&detailStats);
|
|
SetPlugInText(plugInText);
|
|
SetLogFile(m_pNode->GetLogPath());
|
|
SetLogFileValid(m_pNode->GetLogPathValid());
|
|
bNoMoreRefresh = TRUE;
|
|
// the agent has finished, show files, directories, and shares
|
|
if (m_format != -1)
|
|
{
|
|
m_FilesExamined.Format(L"%ld",m_pStats->filesExamined);
|
|
m_FilesChanged.Format(L"%ld",m_pStats->filesChanged);
|
|
m_FilesUnchanged.Format(L"%ld",m_pStats->filesUnchanged);
|
|
|
|
m_DirectoriesExamined.Format(L"%ld",m_pStats->directoriesExamined);
|
|
m_DirectoriesChanged.Format(L"%ld",m_pStats->directoriesChanged);
|
|
m_DirectoriesUnchanged.Format(L"%ld",m_pStats->directoriesUnchanged);
|
|
|
|
m_SharesExamined.Format(L"%ld",m_pStats->sharesExamined);
|
|
m_SharesChanged.Format(L"%ld",m_pStats->sharesChanged);
|
|
m_SharesUnchanged.Format(L"%ld",m_pStats->sharesUnchanged);
|
|
}
|
|
|
|
m_Status.LoadString(IDS_StatusCompleted);
|
|
|
|
if ( m_PlugInText.GetLength() )
|
|
{
|
|
// Permanently hide the plug-in button, because our plug-ins don't
|
|
// show any useful text.
|
|
// m_PlugInButton.ShowWindow(SW_SHOW);
|
|
}
|
|
UpdateData(FALSE);
|
|
}
|
|
}
|
|
else if (m_pNode->IsDoneMonitoring()) // we should let the main monitoring thread
|
|
// do the job
|
|
{
|
|
// if we have result, use the last logic
|
|
if (!m_pNode->HasResult())
|
|
{
|
|
bNoMoreRefresh = TRUE;
|
|
|
|
if (m_pNode->QueryFailed())
|
|
m_Status.LoadString(IDS_Status_Unknown);
|
|
else
|
|
m_Status = GET_WSTR(IDS_DCT_Status_Completed_With_Errors);
|
|
UpdateData(FALSE);
|
|
}
|
|
}
|
|
|
|
if (bNoMoreRefresh)
|
|
{
|
|
bDetailDone = TRUE;
|
|
GetDlgItem(IDC_BTNREFRESH)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_REFRESH_LABEL)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_STOPAGENT)->EnableWindow(FALSE);
|
|
}
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = m_pAgent.GetActiveObject(CLSID_DCTAgent);
|
|
|
|
if ( FAILED(hr) )
|
|
{
|
|
if ( hr == MK_E_UNAVAILABLE )
|
|
{
|
|
m_Status.LoadString(IDS_AgentNotRunning);
|
|
}
|
|
else
|
|
{
|
|
m_Status.FormatMessage(IDS_NoActiveAgent,hr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ( m_pAgent != NULL )
|
|
{
|
|
hr = m_pAgent->raw_QueryJobStatus(jobID,&pUnk);
|
|
if ( SUCCEEDED(hr) && pUnk )
|
|
{
|
|
m_AgentAlive = TRUE;
|
|
pVarSet = pUnk;
|
|
pUnk->Release();
|
|
_bstr_t text = pVarSet->get(GET_BSTR(DCTVS_JobStatus));
|
|
m_Status = (LPCWSTR)text;
|
|
text = pVarSet->get(GET_BSTR(DCTVS_CurrentPath));
|
|
m_Current = (LPCWSTR)text;
|
|
text = pVarSet->get(GET_BSTR(DCTVS_CurrentOperation));
|
|
m_Operation = (LPCWSTR)text;
|
|
// Get the stats
|
|
LONG num1,num2,num3,num4;
|
|
UpdateData(FALSE);
|
|
if ( !UStrICmp(m_Operation,GET_STRING(IDS_ACCT_REPL_OPERATION_TEXT)) )
|
|
{
|
|
// Set up the labels for account replication
|
|
SetupAcctReplFormat();
|
|
}
|
|
else if ( !UStrICmp(m_Operation,GET_STRING(IDS_FST_OPERATION_TEXT)) )
|
|
{
|
|
SetupFSTFormat();
|
|
}
|
|
else if ( ! UStrICmp(m_Operation,GET_STRING(IDS_EST_OPERATION_TEXT)) )
|
|
{
|
|
SetupESTFormat();
|
|
}
|
|
else
|
|
{
|
|
if ( m_Current.GetLength() &&
|
|
( _wtoi(m_FilesExamined) + _wtoi(m_DirectoriesExamined) + _wtoi(m_SharesExamined)) == 0 )
|
|
{
|
|
// unless some stats have already been collected, hide the stats, if the operation
|
|
// is not one that we have detailed stats for.
|
|
SetupOtherFormat();
|
|
}
|
|
}
|
|
switch ( m_format )
|
|
{
|
|
|
|
|
|
case 0: // FST
|
|
|
|
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Files_Examined));
|
|
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Files_Changed));
|
|
m_FilesExamined.Format(L"%ld",num1);
|
|
if ( ! m_bGatheringInfo )
|
|
{
|
|
m_FilesChanged.Format(L"%ld",num2);
|
|
m_FilesUnchanged.Format(L"%ld",num1-num2);
|
|
}
|
|
else
|
|
{
|
|
m_FilesChanged.Empty();
|
|
m_FilesUnchanged.Empty();
|
|
}
|
|
|
|
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Directories_Examined));
|
|
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Directories_Changed));
|
|
m_DirectoriesExamined.Format(L"%ld",num1);
|
|
if ( ! m_bGatheringInfo )
|
|
{
|
|
m_DirectoriesChanged.Format(L"%ld",num2);
|
|
m_DirectoriesUnchanged.Format(L"%ld",num1-num2);
|
|
}
|
|
else
|
|
{
|
|
m_DirectoriesChanged.Empty();
|
|
m_DirectoriesUnchanged.Empty();
|
|
}
|
|
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Shares_Examined));
|
|
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Shares_Changed));
|
|
m_SharesExamined.Format(L"%ld",num1);
|
|
if ( ! m_bGatheringInfo )
|
|
{
|
|
m_SharesChanged.Format(L"%ld",num2);
|
|
m_SharesUnchanged.Format(L"%ld",num1-num2);
|
|
}
|
|
else
|
|
{
|
|
m_SharesChanged.Empty();
|
|
m_SharesUnchanged.Empty();
|
|
}
|
|
break;
|
|
case 1: // AcctRepl
|
|
// files = user accounts
|
|
// dirs = global groups + local groups
|
|
// shares = computer accounts
|
|
// examined = processed
|
|
// changed = created + replaced
|
|
// unchanged = errors
|
|
// User stats
|
|
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Users_Examined));
|
|
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Users_Created));
|
|
num3 = pVarSet->get(GET_BSTR(DCTVS_Stats_Users_Replaced));
|
|
num4 = pVarSet->get(GET_BSTR(DCTVS_Stats_Users_Errors));
|
|
|
|
m_FilesExamined.Format(L"%ld",num1);
|
|
m_FilesChanged.Format(L"%ld",num2+num3);
|
|
m_FilesUnchanged.Format(L"%ld",num4);
|
|
|
|
// Global group stats
|
|
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_GlobalGroups_Examined));
|
|
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_GlobalGroups_Created));
|
|
num3 = pVarSet->get(GET_BSTR(DCTVS_Stats_GlobalGroups_Replaced));
|
|
num4 = pVarSet->get(GET_BSTR(DCTVS_Stats_GlobalGroups_Errors));
|
|
// local group stats
|
|
LONG num5, num6,num7, num8;
|
|
|
|
num5 = pVarSet->get(GET_BSTR(DCTVS_Stats_LocalGroups_Examined));
|
|
num6 = pVarSet->get(GET_BSTR(DCTVS_Stats_LocalGroups_Created));
|
|
num7 = pVarSet->get(GET_BSTR(DCTVS_Stats_LocalGroups_Replaced));
|
|
num8 = pVarSet->get(GET_BSTR(DCTVS_Stats_LocalGroups_Errors));
|
|
|
|
m_DirectoriesExamined.Format(L"%ld",num1 + num5);
|
|
m_DirectoriesChanged.Format(L"%ld",num2+num3 + num6+num7);
|
|
m_DirectoriesUnchanged.Format(L"%ld",num4 + num8);
|
|
|
|
// computer account stats
|
|
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Computers_Examined));
|
|
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Computers_Created));
|
|
num3 = pVarSet->get(GET_BSTR(DCTVS_Stats_Computers_Replaced));
|
|
num4 = pVarSet->get(GET_BSTR(DCTVS_Stats_Computers_Errors));
|
|
|
|
m_SharesExamined.Format(L"%ld",num1);
|
|
m_SharesChanged.Format(L"%ld",num2+num3);
|
|
m_SharesUnchanged.Format(L"%ld",num4);
|
|
break;
|
|
|
|
case 2: // EST
|
|
num1 = pVarSet->get(GET_BSTR(DCTVS_Stats_Mailboxes_Examined));
|
|
num2 = pVarSet->get(GET_BSTR(DCTVS_Stats_Mailboxes_Changed));
|
|
|
|
m_FilesExamined.Format(L"%ld",num1);
|
|
m_FilesChanged.Format(L"%ld",num2);
|
|
m_FilesUnchanged.Format(L"%ld",num1-num2);
|
|
|
|
// since we are not doing anything with containers
|
|
// we empty those field as well
|
|
m_DirectoriesExamined.Empty();
|
|
m_DirectoriesChanged.Empty();
|
|
m_DirectoriesUnchanged.Empty();
|
|
|
|
m_SharesExamined.Empty();
|
|
m_SharesChanged.Empty();
|
|
m_SharesUnchanged.Empty();
|
|
break;
|
|
|
|
case -1: // default (empty)
|
|
m_FilesExamined.Empty();
|
|
m_FilesChanged.Empty();
|
|
m_FilesUnchanged.Empty();
|
|
m_DirectoriesExamined.Empty();
|
|
m_DirectoriesChanged.Empty();
|
|
m_DirectoriesUnchanged.Empty();
|
|
m_SharesExamined.Empty();
|
|
m_SharesChanged.Empty();
|
|
m_SharesUnchanged.Empty();
|
|
break;
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( hr == DISP_E_UNKNOWNNAME )
|
|
{
|
|
m_StatusUnknown = TRUE;
|
|
m_Status.FormatMessage(IDS_AgentJobNotFound,(WCHAR*)jobID);
|
|
}
|
|
else if ( hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE) )
|
|
{
|
|
if (m_pNode && m_pNode->IsJoinDomainWithRename())
|
|
{
|
|
m_pAgent = NULL; // this way, we will use the logic for m_pAgent == NULL
|
|
}
|
|
else
|
|
m_Status.LoadString(IDS_AgentNoLongerRunning);
|
|
}
|
|
else
|
|
{
|
|
m_StatusUnknown = TRUE;
|
|
m_Status.FormatMessage(IDS_QueryJobStatusFailed,hr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
m_StatusUnknown = TRUE;
|
|
m_Status.FormatMessage(IDS_ExceptionConnectingToAgent);
|
|
//m_Current = step;
|
|
}
|
|
}
|
|
|
|
if ( m_PlugInText.GetLength() )
|
|
{
|
|
// permanently hide the plug-in button, because our plug-ins
|
|
// don't show any useful text
|
|
//m_PlugInButton.ShowWindow(SW_SHOW);
|
|
}
|
|
|
|
//get the job log file when agent is done
|
|
if ((!m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed))
|
|
|| !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed_With_Errors)))
|
|
&& (m_pNode))
|
|
{
|
|
SetLogFile(m_pNode->GetLogPath());
|
|
SetLogFileValid(m_pNode->GetLogPathValid());
|
|
}
|
|
|
|
if ( m_LogFile.GetLength() )
|
|
{
|
|
m_ViewLogButton.ShowWindow(SW_SHOW);
|
|
if ( ! m_AgentAlive || !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed))
|
|
|| !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed_With_Errors)))
|
|
{
|
|
m_ViewLogButton.EnableWindow(TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_ViewLogButton.EnableWindow(FALSE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_ViewLogButton.ShowWindow(SW_HIDE);
|
|
}
|
|
|
|
if ( ! m_AgentAlive || !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed))
|
|
|| !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed_With_Errors)))
|
|
{
|
|
// Disable the refresh button when the status changes to Completed.
|
|
if ( !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed))
|
|
|| !m_Status.CompareNoCase(GET_STRING(IDS_DCT_Status_Completed_With_Errors)))
|
|
{
|
|
if ( GetDefID() == IDC_BTNREFRESH )
|
|
{
|
|
SetDefID(IDOK);
|
|
}
|
|
m_RefreshButton.EnableWindow(FALSE);
|
|
}
|
|
// disable the stop agent button any time the agent is not running
|
|
m_StopAgentButton.EnableWindow(FALSE);
|
|
|
|
//enable the close button any time the agent is not running
|
|
m_OKButton.EnableWindow(TRUE);
|
|
|
|
// if auto closing dialog
|
|
if (m_bAutoClose)
|
|
{
|
|
OnOK();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// enable the refresh and stop agent buttons when the agent is alive and running
|
|
m_RefreshButton.EnableWindow(TRUE);
|
|
m_StopAgentButton.EnableWindow(TRUE);
|
|
}
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CAgentDetailDlg::OnOK()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
if (!m_bAutoClose)
|
|
{
|
|
CString str;
|
|
CString title;
|
|
|
|
str = GET_STRING(IDS_DCT_Status_InProgress);
|
|
title.LoadString(IDS_MessageTitle);
|
|
|
|
if ( ! m_hBinding ) // only show the warning for the local agent
|
|
{
|
|
if ( str == m_Status )
|
|
{
|
|
str.LoadString(IDS_CannotCloseWhileAgentIsRunning);
|
|
MessageBox(str,title,MB_ICONHAND | MB_OK);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
bDetailDone = TRUE;
|
|
|
|
if ( m_pAgent )
|
|
{
|
|
m_pAgent = NULL;
|
|
}
|
|
|
|
if (m_bCoInitialized)
|
|
{
|
|
CoUninitialize();
|
|
m_bCoInitialized = FALSE;
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
void CAgentDetailDlg::OnChangeEdit2()
|
|
{
|
|
UpdateData(TRUE);
|
|
detailInterval = _wtoi(m_RefreshRate);
|
|
if ( detailInterval <= 0 )
|
|
{
|
|
detailInterval = 1;
|
|
}
|
|
}
|
|
|
|
LRESULT CAgentDetailDlg::DoRefresh(UINT nID, long x)
|
|
{
|
|
OnRefresh();
|
|
return 0;
|
|
}
|
|
|
|
void CAgentDetailDlg::OnStopAgent()
|
|
{
|
|
DWORD rc = 0;
|
|
HRESULT hr = S_OK;
|
|
CString message;
|
|
CString title;
|
|
|
|
if (!m_bCoInitialized)
|
|
return;
|
|
|
|
title.LoadString(IDS_MessageTitle);
|
|
|
|
if ( m_hBinding )
|
|
{
|
|
message.LoadString(IDS_ConfirmStopAgent);
|
|
if ( MessageBox(message,title,MB_ICONQUESTION | MB_YESNO) == IDYES )
|
|
{
|
|
_bstr_t jobID = m_pNode->GetJobID();
|
|
|
|
if ( m_pAgent )
|
|
{
|
|
hr = m_pAgent->raw_CancelJob(jobID);
|
|
m_pAgent = NULL;
|
|
}
|
|
else
|
|
{
|
|
message.LoadString(IDS_AgentNotRunning);
|
|
MessageBox(message,NULL,MB_OK);
|
|
}
|
|
if ( FAILED(hr) )
|
|
{
|
|
message.FormatMessage(IDS_CancelJobFailed,hr);
|
|
MessageBox(message,NULL,MB_ICONERROR | MB_OK);
|
|
}
|
|
if ( rc )
|
|
{
|
|
message.FormatMessage(IDS_StopAgentFailed,rc);
|
|
MessageBox(message,NULL,MB_ICONERROR|MB_OK);
|
|
}
|
|
if ( SUCCEEDED(hr) && !rc )
|
|
{
|
|
OnOK();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Local agent here
|
|
if ( m_pAgent )
|
|
{
|
|
message.LoadString(IDS_ConfirmCancelJob);
|
|
if ( MessageBox(message,NULL,MB_ICONQUESTION | MB_YESNO) == IDYES )
|
|
{
|
|
hr = m_pAgent->raw_CancelJob(m_JobGuid);
|
|
if ( FAILED(hr) )
|
|
{
|
|
message.FormatMessage(IDS_StopAgentFailedHexResult,hr);
|
|
MessageBox(message,NULL,MB_ICONERROR | MB_OK);
|
|
}
|
|
else
|
|
{
|
|
gbCancelled = TRUE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// TODO:error message
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void CAgentDetailDlg::OnViewLog()
|
|
{
|
|
UpdateData(TRUE);
|
|
if ( ! m_LogFile.IsEmpty() )
|
|
{
|
|
if (m_LogFileIsValid)
|
|
{
|
|
// Launch the logfile
|
|
CString cmd;
|
|
STARTUPINFO startupInfo;
|
|
PROCESS_INFORMATION processInfo;
|
|
|
|
TCHAR* pszSystemDirectoryName = NULL;
|
|
CString message;
|
|
CString title;
|
|
|
|
pszSystemDirectoryName = GetSystemDirectoryHelper();
|
|
if(!pszSystemDirectoryName)
|
|
{
|
|
// we could not get the system directory name, we should bail out, otherwise we might launch
|
|
// malicious process
|
|
title.LoadString(IDS_MessageTitle);
|
|
message.LoadString(IDS_LaunchNotePadFailed);
|
|
|
|
MessageBox(message, title, MB_ICONERROR | MB_OK);
|
|
return;
|
|
}
|
|
|
|
|
|
memset(&startupInfo,0,(sizeof startupInfo));
|
|
|
|
startupInfo.cb = (sizeof startupInfo);
|
|
|
|
cmd.FormatMessage(IDS_NotepadCommandLine,pszSystemDirectoryName,m_LogFile);
|
|
delete [] pszSystemDirectoryName;
|
|
|
|
CreateProcess(NULL,cmd.GetBuffer(0),NULL,NULL,TRUE,0,NULL,NULL,&startupInfo,&processInfo);
|
|
}
|
|
else
|
|
{
|
|
CString title;
|
|
CString message;
|
|
|
|
title.LoadString(IDS_MessageTitle);
|
|
message.FormatMessage(IDS_LogfileIsInvalid,m_LogFile,m_ServerName);
|
|
MessageBox(message,title,MB_ICONERROR | MB_OK);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CAgentDetailDlg::OnPlugInResults()
|
|
{
|
|
UpdateData(TRUE);
|
|
MessageBox(m_PlugInText);
|
|
}
|
|
|
|
void CAgentDetailDlg::OnClose()
|
|
{
|
|
UpdateData(TRUE);
|
|
CString str;
|
|
CString title;
|
|
|
|
str = GET_STRING(IDS_DCT_Status_InProgress);
|
|
title.LoadString(IDS_MessageTitle);
|
|
|
|
if ( ! m_hBinding ) // only show the warning for the local agent
|
|
{
|
|
if ( str == m_Status )
|
|
{
|
|
str.LoadString(IDS_ConfirmCloseWhileAgentIsRunning);
|
|
if ( IDYES != MessageBox(str,title,MB_ICONQUESTION | MB_YESNO) )
|
|
return;
|
|
}
|
|
}
|
|
bDetailDone = TRUE;
|
|
if ( m_pAgent )
|
|
{
|
|
m_pAgent = NULL;
|
|
}
|
|
|
|
if (m_bCoInitialized)
|
|
{
|
|
CoUninitialize();
|
|
m_bCoInitialized = FALSE;
|
|
}
|
|
|
|
CDialog::OnClose();
|
|
}
|
|
|
|
BOOL CAgentDetailDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
TRACE(L"Command(%lx,%lx)\n",wParam,lParam);
|
|
if ( wParam == WM_DESTROY )
|
|
{
|
|
CString str;
|
|
CString title;
|
|
CString str2;
|
|
|
|
str = GET_STRING(IDS_DCT_Status_InProgress);
|
|
str2 = GET_STRING(IDS_DCT_Status_NotStarted);
|
|
title.LoadString(IDS_MessageTitle);
|
|
|
|
if ( ! m_hBinding ) // only show the warning for the local agent
|
|
{
|
|
if ( str == m_Status )
|
|
{
|
|
str.LoadString(IDS_ConfirmCloseWhileAgentIsRunning);
|
|
if ( IDYES != MessageBox(str,title,MB_ICONQUESTION | MB_YESNO) )
|
|
return 0;
|
|
}
|
|
}
|
|
bDetailDone = TRUE;
|
|
if ( m_pAgent )
|
|
{
|
|
m_pAgent = NULL;
|
|
}
|
|
|
|
if (m_bCoInitialized)
|
|
{
|
|
CoUninitialize();
|
|
m_bCoInitialized = FALSE;
|
|
}
|
|
|
|
return CDialog::OnCommand(wParam, lParam);
|
|
|
|
}
|
|
else
|
|
{
|
|
return CDialog::OnCommand(wParam, lParam);
|
|
}
|
|
}
|
|
|
|
|
|
// OnNcPaint Handler
|
|
//
|
|
// This handler is being overridden to handle hiding of the dialog.
|
|
// This prevents initial painting of the dialog which causes a flash
|
|
// if the dialog is hidden after this message. This is the first message
|
|
// where the dialog can be hidden. Trying to hide the dialog before this
|
|
// point gets overridden.
|
|
|
|
void CAgentDetailDlg::OnNcPaint()
|
|
{
|
|
if (m_bAutoHide)
|
|
{
|
|
if (IsWindowVisible())
|
|
{
|
|
ShowWindow(SW_HIDE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CDialog::OnNcPaint();
|
|
}
|
|
}
|