From 0e2451b7dd32f78492dd64de6f21d5c8265115d6 Mon Sep 17 00:00:00 2001 From: Eric Menezes Noronha Date: Mon, 7 Jul 2014 10:52:19 -0300 Subject: [PATCH] -Acrescentado debugador do cacicservice, pois devido ao script de instalação pelo netlogon, o serviço estava sendo instalado sem ser com o tipo idetarivo. -Acrescentado loop de espera para pegar o nome de usuário logado, pois às vezes o mapa executava antes de realizar o login completo na máquina. --- CACIC_Library.pas | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ Grupo_CACIC.groupproj | 24 ++++++++++++------------ MapaTesteProj/MapaCACIC.dproj | 2 +- MapaTesteProj/MapaCACIC.res | Bin 4188 -> 0 bytes MapaTesteProj/MapaTeste.dcu | Bin 31513 -> 0 bytes MapaTesteProj/MapaTeste.pas | 30 ++++++++++++++++++++---------- MapaTesteProj/Source/synsock.pas | 2 +- cacic280.dproj | 2 +- cacic280.res | Bin 4872 -> 0 bytes cacicservice/CACICserviceMain.pas | 11 +---------- cacicservice/cacicservice.dproj | 2 +- cacicservice/cacicservice.res | Bin 5292 -> 0 bytes gercols/gercols.dpr | 5 +++-- installcacic/installcacic.dproj | 2 +- installcacic/installcacic.res | Bin 3304 -> 0 bytes installcacic/uInstallCACIC.pas | 79 ++++++++++++++++++++++++++----------------------------------------------------- main.pas | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 17 files changed, 274 insertions(+), 102 deletions(-) diff --git a/CACIC_Library.pas b/CACIC_Library.pas index 4361bf2..0a6bf9b 100755 --- a/CACIC_Library.pas +++ b/CACIC_Library.pas @@ -60,6 +60,7 @@ uses Windows, Tlhelp32, ComObj, ShellAPI, + WinSvc, Variants; type @@ -124,7 +125,7 @@ type {*------------------------------------------------------------------------------ Classe geral da biblioteca -------------------------------------------------------------------------------} - TCACIC = class(TCACIC_Windows) + TCACIC = class(TCACIC_Windows) constructor Create(); destructor Destroy; override; private @@ -140,7 +141,7 @@ type Windows : TCACIC_Windows; /// objeto de informacoes de windows function checkIfFileDateIsToday(pStrFileName : String) : Boolean; function countOccurences(const strSubText, strText: string) : Integer; - function createOneProcess(pStrCmd: string; pBoolWait: boolean; pWordShowWindow : word = SW_HIDE) : Boolean; + function createOneProcess(pStrCmd: string; pBoolWait: boolean; pWordShowWindow : word = SW_HIDE; waitMilliseconds : cardinal = INFINITE) : Boolean; function capitalize (CONST s: STRING) : String; function checkModule(pStrModuleFileName, pStrModuleHashCode : String) : String; function deCrypt(pStrCipheredText : String; pBoolShowInLog : boolean = true; pBoolForceDecrypt : boolean = false) : String; @@ -199,6 +200,10 @@ type procedure writeDailyLog(pStrLogMessage : String; pStrFileNameSuffix : String = ''); procedure writeDebugLog(pStrDebugMessage : String); override; procedure writeExceptionLog(pStrExceptionMessage, pStrExceptionClassName : String; pStrAddedMessage : String = ''); override; + + function serviceGetType(sMachine, sService: PChar): DWORD; + function serviceStart(sMachine,sService : string ) : boolean; + function ServiceGetStatus(sMachine, sService: PChar): DWORD; end; // Declaração de constantes para a biblioteca @@ -1091,6 +1096,47 @@ begin end; end; +function TCACIC.serviceStart(sMachine,sService : string ) : boolean; +var + schm,schs : SC_Handle; + ss : TServiceStatus; + psTemp : PChar; + dwChkP : DWord; +begin + ss.dwCurrentState := 0; + schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNECT); + if(schm > 0)then + begin + schs := OpenService(schm,PChar(sService),SERVICE_START or SERVICE_QUERY_STATUS); + if(schs > 0)then + begin + psTemp := Nil; + if(StartService(schs,0,psTemp))then + begin + if(QueryServiceStatus(schs,ss))then + begin + while(SERVICE_RUNNING <> ss.dwCurrentState)do + begin + dwChkP := ss.dwCheckPoint; + Sleep(ss.dwWaitHint); + if(not QueryServiceStatus(schs,ss))then + begin + break; + end; + if(ss.dwCheckPoint < dwChkP)then + begin + break; + end; + end; + end; + end; + CloseServiceHandle(schs); + end; + CloseServiceHandle(schm); + end; + Result := SERVICE_RUNNING = ss.dwCurrentState; +end; + procedure TCACIC.writeDebugLog(pStrDebugMessage : String); Begin if isInDebugMode(copy(pStrDebugMessage,1,pos(':',pStrDebugMessage)-1)) then @@ -1224,7 +1270,7 @@ end; @param p_wait TRUE se deve aguardar término da excução, FALSE caso contrário @param p_showWindow Constante que define o tipo de exibição da janela do aplicativo -------------------------------------------------------------------------------} -function TCACIC.createOneProcess(pStrCmd: string; pBoolWait: boolean; pWordShowWindow : word = SW_HIDE): boolean; +function TCACIC.createOneProcess(pStrCmd: string; pBoolWait: boolean; pWordShowWindow : word = SW_HIDE; waitMilliseconds : cardinal = INFINITE): boolean; var SUInfo: TStartupInfo; ProcInfo: TProcessInformation; @@ -1244,8 +1290,7 @@ begin nil, nil, false, - CREATE_NEW_CONSOLE or - BELOW_NORMAL_PRIORITY_CLASS, + NORMAL_PRIORITY_CLASS, nil, nil, SUInfo, @@ -1253,7 +1298,7 @@ begin if (Result) then begin if(pBoolWait) then begin - WaitForSingleObject(ProcInfo.hProcess, INFINITE); + WaitForSingleObject(ProcInfo.hProcess, waitMilliseconds); CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); end; @@ -1950,5 +1995,102 @@ begin end; end; end; + +function TCACIC.ServiceGetType(sMachine, sService: PChar): DWORD; + {*******************************************} + {*** Parameters: ***} + {*** sService: specifies the name of the service to open + {*** sMachine: specifies the name of the target computer + {*** ***} + {*** Return Values: ***} + +var + SCManHandle, SvcHandle: SC_Handle; + SS: TServiceStatus; + dwStat: DWORD; +begin + dwStat := 0; + // Open service manager handle. + writeDebugLog('ServiceGetStatus: Executando OpenSCManager.SC_MANAGER_CONNECT'); + SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT); + if (SCManHandle > 0) then + begin + writeDebugLog('ServiceGetStatus: Executando OpenService.SERVICE_QUERY_STATUS'); + SvcHandle := OpenService(SCManHandle, sService, SERVICE_ALL_ACCESS); + // if Service installed + if (SvcHandle > 0) then + begin + writeDebugLog('ServiceGetStatus: O serviço "'+ sService +'" já está instalado.'); + // SS structure holds the service status (TServiceStatus); + if (QueryServiceStatus(SvcHandle, SS)) then + dwStat := ss.dwServiceType; + if dwStat <> 272 then + begin + ChangeServiceConfig(SvcHandle, + 272, //iterative + SERVICE_NO_CHANGE, + SERVICE_NO_CHANGE, + nil, + nil, + nil, + nil, + nil, + nil, + nil); + end; + + if (QueryServiceStatus(SvcHandle, SS)) then + dwStat := ss.dwServiceType; + CloseServiceHandle(SvcHandle); + end; + CloseServiceHandle(SCManHandle); + end; + Result := dwStat; +end; + +function TCACIC.ServiceGetStatus(sMachine, sService: PChar): DWORD; + {*******************************************} + {*** Parameters: ***} + {*** sService: specifies the name of the service to open + {*** sMachine: specifies the name of the target computer + {*** ***} + {*** Return Values: ***} + {*** -1 = Error opening service ***} + {*** 1 = SERVICE_STOPPED ***} + {*** 2 = SERVICE_START_PENDING ***} + {*** 3 = SERVICE_STOP_PENDING ***} + {*** 4 = SERVICE_RUNNING ***} + {*** 5 = SERVICE_CONTINUE_PENDING ***} + {*** 6 = SERVICE_PAUSE_PENDING ***} + {*** 7 = SERVICE_PAUSED ***} + {******************************************} +var + SCManHandle, SvcHandle: SC_Handle; + SS: TServiceStatus; + dwStat: DWORD; +begin + dwStat := 0; + // Open service manager handle. + writeDebugLog('ServiceGetStatus: Executando OpenSCManager.SC_MANAGER_CONNECT'); + SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT); + if (SCManHandle > 0) then + begin + writeDebugLog('ServiceGetStatus: Executando OpenService.SERVICE_QUERY_STATUS'); + SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS); + // if Service installed + if (SvcHandle > 0) then + begin + writeDebugLog('ServiceGetStatus: O serviço "'+ sService +'" já está instalado.'); + // SS structure holds the service status (TServiceStatus); + if (QueryServiceStatus(SvcHandle, SS)) then + dwStat := ss.dwCurrentState; + + CloseServiceHandle(SvcHandle); + end; + CloseServiceHandle(SCManHandle); + end; + Result := dwStat; +end; + end. diff --git a/Grupo_CACIC.groupproj b/Grupo_CACIC.groupproj index cf00fe2..2e8c1bb 100644 --- a/Grupo_CACIC.groupproj +++ b/Grupo_CACIC.groupproj @@ -19,15 +19,6 @@ - - - - - - - - - @@ -37,6 +28,15 @@ + + + + + + + + + @@ -83,12 +83,12 @@ - + - + - + \ No newline at end of file diff --git a/MapaTesteProj/MapaCACIC.dproj b/MapaTesteProj/MapaCACIC.dproj index d9ee6c8..1fbca1b 100644 --- a/MapaTesteProj/MapaCACIC.dproj +++ b/MapaTesteProj/MapaCACIC.dproj @@ -24,7 +24,7 @@ Delphi.Personality -FalseTrueFalseTrueFalse2817TrueFalseFalseFalseFalse10461252Dataprev - Emp. de TI da Prev Social - URES/SESSSistema CACIC - Módulo para Verificação e Instalação de Estrutura Básica do Sistema CACIC2.8.1.73.0Licença: GNU/LGPLmapacacic.dprFalse +FalseTrueFalseTrueFalse2818TrueFalseFalseFalseFalse10461252Dataprev - Emp. de TI da Prev Social - URES/SESSSistema CACIC - Módulo para Verificação e Instalação de Estrutura Básica do Sistema CACIC2.8.1.83.0Licença: GNU/LGPLmapacacic.dprFalse diff --git a/MapaTesteProj/MapaCACIC.res b/MapaTesteProj/MapaCACIC.res index cbe2c8d..2509e0c 100644 Binary files a/MapaTesteProj/MapaCACIC.res and b/MapaTesteProj/MapaCACIC.res differ diff --git a/MapaTesteProj/MapaTeste.dcu b/MapaTesteProj/MapaTeste.dcu index c89d495..aec86b1 100644 Binary files a/MapaTesteProj/MapaTeste.dcu and b/MapaTesteProj/MapaTeste.dcu differ diff --git a/MapaTesteProj/MapaTeste.pas b/MapaTesteProj/MapaTeste.pas index c72808c..6f213d5 100644 --- a/MapaTesteProj/MapaTeste.pas +++ b/MapaTesteProj/MapaTeste.pas @@ -166,8 +166,10 @@ Begin Visible := false; reset(textFileAguarde); - objCACIC.deleteFileOrFolder(objCacic.getLocalFolderName + - '\temp\aguarde_MAPACACIC.txt'); + if FileExists(objCACIC.getLocalFolderName + '\temp\aguarde_MAPACACIC.txt') then + objCACIC.deleteFileOrFolder(objCacic.getLocalFolderName + + '\temp\aguarde_MAPACACIC.txt'); + Application.ProcessMessages; Sair; @@ -315,7 +317,7 @@ Begin End else begin - MessageDlg(#13#13+'Não foi possível realizar a conexão!',mtError, [mbOK], 0); + objCACIC.writeDailyLog('Não foi possível realizar a conexão!'); end; btCombosUpdate.Enabled := true; End; @@ -428,7 +430,9 @@ end; procedure TfrmMapaCacic.MontaInterface; var strConfigsPatrimonioInterface, strNomeLDAP : String; + count : integer; Begin + count := 0; btCombosUpdate.Enabled := false; strConfigsPatrimonioInterface := objCacic.deCrypt(objCacic.getValueFromFile @@ -449,9 +453,15 @@ Begin //-----------------------------USUARIO LOGADO----------------------------------- // edTeInfoUserLogado.Text := getUserLogon; - strTeInfoPatrimonio2:=objCACIC.getValueFromTags('UserName',fetchWMIvalues('Win32_ComputerSystem',objCACIC.getLocalFolderName,'UserName')); - strTeInfoPatrimonio2:=copy(strTeInfoPatrimonio2, pos('\', strTeInfoPatrimonio2)+1, length(strTeInfoPatrimonio2)); - edTeInfoPatrimonio2.Text:=strTeInfoPatrimonio2; + while(strTeInfoPatrimonio2 = '') and (count < 600) do + begin + strTeInfoPatrimonio2:=objCACIC.getValueFromTags('UserName',fetchWMIvalues('Win32_ComputerSystem',objCACIC.getLocalFolderName,'UserName')); + strTeInfoPatrimonio2:=copy(strTeInfoPatrimonio2, pos('\', strTeInfoPatrimonio2)+1, length(strTeInfoPatrimonio2)); + edTeInfoPatrimonio2.Text:=strTeInfoPatrimonio2; + sleep(1000); + count := count + 1; + end; + if edTeInfoPatrimonio2.Text <> '' then begin lbEtiqueta2.Visible := true; @@ -684,10 +694,10 @@ begin else Begin frmMapaCacic.boolAcessoOK := false; - MessageDLG(#13#10+'Atenção! É necessário reinstalar o CACIC nesta estação.' + #13#10 + #13#10 + - 'A escctrutura encontra-se corrompida.' + #13#10,mtError,[mbOK],0); - Application.ProcessMessages; - frmMapaCacic.Finalizar; + Application.messagebox(Pchar('Atenção! É necessário reinstalar o CACIC nesta estação.' + + #13#10 + #13#10 + 'A estrutura encontra-se corrompida.'), + 'Erro!',MB_ICONERROR + mb_ok); + Finalizar; End; end else diff --git a/MapaTesteProj/Source/synsock.pas b/MapaTesteProj/Source/synsock.pas index 6e851a8..ca576af 100644 --- a/MapaTesteProj/Source/synsock.pas +++ b/MapaTesteProj/Source/synsock.pas @@ -53,7 +53,7 @@ unit synsock; {$ENDIF} {$IFDEF WIN32} - {$I sswin32.inc} + {$I sswin32q.inc} {$ELSE} {$IFDEF FPC} {$I ssfpc.pas} diff --git a/cacic280.dproj b/cacic280.dproj index 7259f0a..74d2234 100644 --- a/cacic280.dproj +++ b/cacic280.dproj @@ -40,7 +40,7 @@ Delphi.Personality VCLApplication -FalseTrueFalseTrueFalse2819FalseFalseFalseFalseFalse10461252Dataprev - Emp. de TI da Prev.Social - URES/SESSSistema CACIC - Módulo Agente Principal2.8.1.9Baseado na licença GNU/LGPLCacic - Configurador Automático e Coletor de Informações Computacionais3.0cacic280.dpr +FalseTrueFalseTrueFalse28111FalseFalseFalseFalseFalse10461252Dataprev - Emp. de TI da Prev.Social - URES/SESSSistema CACIC - Módulo Agente Principal2.8.1.11Baseado na licença GNU/LGPLCacic - Configurador Automático e Coletor de Informações Computacionais3.0cacic280.dpr diff --git a/cacic280.res b/cacic280.res index 3a6c4cc..6cb2f31 100644 Binary files a/cacic280.res and b/cacic280.res differ diff --git a/cacicservice/CACICserviceMain.pas b/cacicservice/CACICserviceMain.pas index d999ead..e3b887d 100755 --- a/cacicservice/CACICserviceMain.pas +++ b/cacicservice/CACICserviceMain.pas @@ -97,7 +97,7 @@ begin //TOKEN_ADJUST_SESSIONID := 256; // Log the client on to the local computer. - + ServiceType := stWin32; dwSessionId := WTSGetActiveConsoleSessionId(); hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap = INVALID_HANDLE_VALUE) then @@ -433,15 +433,6 @@ Begin else g_oCacic.writeDebugLog('ExecutaCACIC: Cookie Bloqueado pelo Agente Principal ENCONTRADO - CACIC em Execução!'); - // Execução do MAPA. - if ((g_oCacic.getValueFromFile('Configs', 'modulo_patr', - g_oCacic.getLocalFolderName + 'GerCols.inf') = 'S') and - (g_oCacic.getValueFromFile('Configs', 'col_patr_exe', - g_oCacic.getLocalFolderName + 'GerCols.inf') <> 's')) then - begin - g_oCacic.createOneProcess(g_oCacic.getLocalFolderName + 'Modules\mapacacic.exe',false,SW_NORMAL); - end; - g_oCacic.writeDebugLog('ExecutaCACIC: Verificando existência de nova versão deste serviço para atualização.'); // Verifico a existência de nova versão do serviço e finalizo em caso positivo... if (FileExists(g_oCacic.getLocalFolderName + 'Temp\cacicservice.exe')) and diff --git a/cacicservice/cacicservice.dproj b/cacicservice/cacicservice.dproj index e773710..3dd3705 100644 --- a/cacicservice/cacicservice.dproj +++ b/cacicservice/cacicservice.dproj @@ -37,7 +37,7 @@ Delphi.Personality VCLApplication -FalseTrueFalseE:\NTService\TrueFalse2816FalseFalseFalseFalseFalse10461252Dataprev - Emp. de TI da Prev Social - URES/SESSSistema CACIC - Módulo para Sustentação do Agente Principal2.8.1.63.0Licença: GNU/LGPLcacicservice.dpr +FalseTrueFalseE:\NTService\TrueFalse2817FalseFalseFalseFalseFalse10461252Dataprev - Emp. de TI da Prev Social - URES/SESSSistema CACIC - Módulo para Sustentação do Agente Principal2.8.1.73.0Licença: GNU/LGPLcacicservice.dpr diff --git a/cacicservice/cacicservice.res b/cacicservice/cacicservice.res index 873de2c..a59638c 100755 Binary files a/cacicservice/cacicservice.res and b/cacicservice/cacicservice.res differ diff --git a/gercols/gercols.dpr b/gercols/gercols.dpr index 49e9234..78958b0 100644 --- a/gercols/gercols.dpr +++ b/gercols/gercols.dpr @@ -247,7 +247,7 @@ Begin if (objCacic.getValueFromTags('WebManagerAddress', strRetorno,'<>') <> '') then Begin - strForcaColeta = objCacic.getValueFromTags('ForcaColeta', strRetorno, '<>'); + strForcaColeta := objCacic.getValueFromTags('ForcaColeta', strRetorno, '<>'); // if strForcaColeta <> 'S' then // objCacic.setValueToFile('Configs','col_patr_exe', // 'n', @@ -850,6 +850,7 @@ Begin else if FindCmdLineSwitch ('getTest', True) then begin getTest(); + Finalizar(false); end; // Chamada efetuada pelo Agente Principal quando da existência de temp\.exe para AutoUpdate @@ -925,7 +926,7 @@ Begin intTotalExecutedCollects := 0; intTotalSendedCollects := 0; - //getConfigs(true); + getConfigs(true); // Abaixo eu testo se existe um endereço configurado para não disparar os procedimentos de coleta em vão. if (objCacic.getWebManagerAddress <> '') then diff --git a/installcacic/installcacic.dproj b/installcacic/installcacic.dproj index 18ace15..f5272b8 100644 --- a/installcacic/installcacic.dproj +++ b/installcacic/installcacic.dproj @@ -32,7 +32,7 @@ Delphi.Personality VCLApplication -FalseTrueFalseTrueFalse2816FalseFalseFalseFalseFalse10461252Dataprev - Emp. de TI da Prev Social - URES/SESSSistema CACIC - Módulo para Verificação e Instalação de Estrutura Básica do Sistema CACIC2.8.1.63.0Licença: GNU/LGPLinstallcacic.dpr +FalseTrueFalseTrueFalse2818FalseFalseFalseFalseFalse10461252Dataprev - Emp. de TI da Prev Social - URES/SESSSistema CACIC - Módulo para Verificação e Instalação de Estrutura Básica do Sistema CACIC2.8.1.83.0Licença: GNU/LGPLinstallcacic.dpr diff --git a/installcacic/installcacic.res b/installcacic/installcacic.res index 2550fdd..b5a410a 100644 Binary files a/installcacic/installcacic.res and b/installcacic/installcacic.res differ diff --git a/installcacic/uInstallCACIC.pas b/installcacic/uInstallCACIC.pas index e71814c..82f449b 100644 --- a/installcacic/uInstallCACIC.pas +++ b/installcacic/uInstallCACIC.pas @@ -111,7 +111,6 @@ type function boolCanRunCACIC : boolean; function findWindowByTitle(pStrWindowTitle: string) : Hwnd; function listFileDir(pStrPath: string) : string; - function serviceGetStatus(sMachine, sService: PChar) : DWORD; function serviceStart(pStrServiceName : string ) : boolean; function serviceRunning(pCharMachineName, pCharServiceName: PChar) : boolean; function serviceStopped(pCharMachineName, pCharServiceName: PChar) : boolean; @@ -135,6 +134,8 @@ implementation {$R *.dfm} procedure TfrmInstallCACIC.FormCreate(Sender: TObject); +var +wordServiceStatus, serviceType : DWord; begin Try boolShowForm := true; @@ -200,49 +201,6 @@ begin End; end; -function TfrmInstallCACIC.ServiceGetStatus(sMachine, sService: PChar): DWORD; - {*******************************************} - {*** Parameters: ***} - {*** sService: specifies the name of the service to open - {*** sMachine: specifies the name of the target computer - {*** ***} - {*** Return Values: ***} - {*** -1 = Error opening service ***} - {*** 1 = SERVICE_STOPPED ***} - {*** 2 = SERVICE_START_PENDING ***} - {*** 3 = SERVICE_STOP_PENDING ***} - {*** 4 = SERVICE_RUNNING ***} - {*** 5 = SERVICE_CONTINUE_PENDING ***} - {*** 6 = SERVICE_PAUSE_PENDING ***} - {*** 7 = SERVICE_PAUSED ***} - {******************************************} -var - SCManHandle, SvcHandle: SC_Handle; - SS: TServiceStatus; - dwStat: DWORD; -begin - dwStat := 0; - // Open service manager handle. - objCacic.writeDebugLog('ServiceGetStatus: Executando OpenSCManager.SC_MANAGER_CONNECT'); - SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT); - if (SCManHandle > 0) then - begin - objCacic.writeDebugLog('ServiceGetStatus: Executando OpenService.SERVICE_QUERY_STATUS'); - SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS); - // if Service installed - if (SvcHandle > 0) then - begin - objCacic.writeDebugLog('ServiceGetStatus: O serviço "'+ sService +'" já está instalado.'); - // SS structure holds the service status (TServiceStatus); - if (QueryServiceStatus(SvcHandle, SS)) then - dwStat := ss.dwCurrentState; - CloseServiceHandle(SvcHandle); - end; - CloseServiceHandle(SCManHandle); - end; - Result := dwStat; -end; - // start service // // return TRUE if successful @@ -393,7 +351,7 @@ Begin End; procedure TfrmInstallCACIC.installCACIC; -var wordServiceStatus : DWORD; +var wordServiceStatus, serviceType : cardinal; tstrRequest_ConfigIC : TStringList; strAuxInstallCACIC : String; begin @@ -717,7 +675,11 @@ begin objCacic, strChkSisInfFileName); - objCacic.setValueToFile('Installation','chkSIS.exe', objCacic.checkModule(objCacic.getWinDir + 'chksis.exe', objCACIC.deCrypt( objCacic.getValueFromTags('CHKSIS.EXE_HASH', strCommResponse,'<>'),false,true)), strChkSisInfFileName); + objCacic.setValueToFile('Installation','chkSIS.exe', + objCacic.checkModule(objCacic.getWinDir + 'chksis.exe', + objCACIC.deCrypt( objCacic.getValueFromTags + ('CHKSIS.EXE_HASH', strCommResponse,'<>'), + false,true)), strChkSisInfFileName); // Caso o Cacic tenha sido baixado executo-o com parâmetro de configuração de servidor if (objCacic.getValueFromFile('Installation','CacicService.exe' , strChkSisInfFileName) = 'Ok!') and @@ -739,8 +701,7 @@ begin ComunicaInsucesso('1'); // O indicador "1" sinalizará que não foi devido a privilégio na estação End; - if boolCanRunCACIC and - (objCacic.getValueFromFile('Installation','ChkSIS.exe', strChkSisInfFileName) = 'Ok!') then + if (objCacic.getValueFromFile('Installation','ChkSIS.exe', strChkSisInfFileName) = 'Ok!') then Begin // Se não for plataforma NT executo o agente principal if not (objCacic.isWindowsNTPlataform()) then @@ -761,8 +722,18 @@ begin {*** 6 = SERVICE_PAUSE_PENDING ***} {*** 7 = SERVICE_PAUSED ***} + informaProgresso('Verificando CACICservice.'); // Verifico se o serviço está instalado/rodando,etc. - wordServiceStatus := ServiceGetStatus(nil,'CacicSustainService'); + wordServiceStatus := objCacic.ServiceGetStatus(nil,'CacicSustainService'); + + //Verifico o serviço para correção de bug + if wordServiceStatus <> 0 then + begin + //verifica o status, se não estiver correto altera + serviceType := objCacic.serviceGetType('', 'CacicSustainService'); + end; + + if (wordServiceStatus = 0) then Begin // Instalo e Habilito o serviço @@ -788,8 +759,10 @@ begin MessageDLG(#13#10+'ATENÇÃO!'+#13#10+#13#10+'Se o ícone do CACIC não for exibido na bandeja do sistema, é recomendável a reinicialização da máquina.',mtInformation,[mbOK],0); informaProgresso('Executando o Agente Principal do CACIC.'); End; - - objCacic.createOneProcess(objCacic.getLocalFolderName + objCACIC.getMainProgramName, false); + + if boolCanRunCACIC then + objCacic.createOneProcess(objCacic.getLocalFolderName + objCACIC.getMainProgramName, false); + End else if FileExists(objCacic.getLocalFolderName + 'aguarde_CACIC.txt') then @@ -823,12 +796,12 @@ end; function TfrmInstallCACIC.serviceRunning(pCharMachineName, pCharServiceName: PChar): Boolean; begin - Result := SERVICE_RUNNING = ServiceGetStatus(pCharMachineName, pCharServiceName); + Result := SERVICE_RUNNING = objCacic.ServiceGetStatus(pCharMachineName, pCharServiceName); end; function TfrmInstallCACIC.serviceStopped(pCharMachineName, pCharServiceName: PChar): Boolean; begin - Result := SERVICE_STOPPED = ServiceGetStatus(pCharMachineName, pCharServiceName); + Result := SERVICE_STOPPED = objCacic.ServiceGetStatus(pCharMachineName, pCharServiceName); end; function TfrmInstallCACIC.findWindowByTitle(pStrWindowTitle: string): Hwnd; diff --git a/main.pas b/main.pas index 059174f..bd056b7 100755 --- a/main.pas +++ b/main.pas @@ -73,6 +73,7 @@ var strConfigsPatrimonio, g_intStatus, g_intStatusAnterior, g_intIconIndex : integer; + bl_primeira_execucao : bool = false; objCACIC: TCACIC; type @@ -961,8 +962,12 @@ Begin Result := not (FileExists(objCACIC.getLocalFolderName + 'aguarde_CACIC.txt')); End; + + procedure TFormularioGeral.FormCreate(Sender: TObject); var textFileAguarde : TextFile; + serviceType, wordServiceStatus : Cardinal; + service_start : bool; begin objCACIC := TCACIC.Create; objCACIC.setLocalFolderName(ExtractFilePath(ParamStr(0))); @@ -972,6 +977,8 @@ begin strGerColsInfFileName := objCACIC.getLocalFolderName + 'gercols.inf'; strChkSisInfFileName := objCACIC.getWinDir + 'chksis.inf'; + bl_primeira_execucao := true; + // A verificação dupla é uma solução de contorno para o caso de o boolCipher ter sido setado após criptografia/deCriptografia do dado gravado if (objCACIC.deCrypt( objCACIC.getValueFromFile('Hash-Codes',objCACIC.getMainProgramName,strChkSisInfFileName),false,true) = objCACIC.getFileHash(ParamStr(0))) then Begin @@ -988,6 +995,44 @@ begin strWin32_NetworkAdapterConfiguration := fetchWMIvalues('Win32_NetworkAdapterConfiguration', objCACIC.getLocalFolderName); strWin32_ComputerSystem := fetchWMIvalues('Win32_ComputerSystem', objCACIC.getLocalFolderName); + //Correção do bug do script net logon da pgfn; + //O script estava instalando o cacic sem interação com desktop, + //bugando o mapa e o trayicon. + + {*** 1 = SERVICE_STOPPED ***} + {*** 2 = SERVICE_START_PENDING ***} + {*** 3 = SERVICE_STOP_PENDING ***} + {*** 4 = SERVICE_RUNNING ***} + {*** 5 = SERVICE_CONTINUE_PENDING ***} + {*** 6 = SERVICE_PAUSE_PENDING ***} + {*** 7 = SERVICE_PAUSED ***} + + // Verifico se o serviço está instalado/rodando,etc. + wordServiceStatus := objCacic.ServiceGetStatus(nil,'CacicSustainService'); + + //Verifico o serviço para correção de bug + // Verifico se o serviço está instalado/rodando,etc. + + if wordServiceStatus <> 0 then + begin + //verifica o status, se não estiver correto altera + serviceType := objCacic.serviceGetType('', 'CacicSustainService'); + end; + + if (wordServiceStatus = 0) then + Begin + // Instalo e Habilito o serviço + objCacic.createOneProcess(objCacic.getWinDir + 'cacicservice.exe /install /silent',true); + End + else if (wordServiceStatus < 4) then + Begin + objCacic.createOneProcess(objCacic.getWinDir + 'cacicservice.exe -start', true); + End + else if (wordServiceStatus > 4) then + Begin + objCacic.createOneProcess(objCacic.getWinDir + 'cacicservice.exe -continue', true); + End; + TrayIcon1 := TTrayIcon.Create(self); TrayIcon1.Hint := pnVersao.Caption; if not (objCACIC.getValueFromTags('IPAddress',strWin32_NetworkAdapterConfiguration) = '') then @@ -1257,7 +1302,7 @@ begin if ((p_acao = 'getTest') or (p_acao = 'getConfigs')) then //se for getTest, esperar a aplicação finalizar. objCACIC.createOneProcess(objCACIC.getLocalFolderName + 'Modules\gercols.exe /'+p_acao+' /WebServicesFolderName='+objCACIC.getWebServicesFolderName +' /LocalFolderName='+objCACIC.getLocalFolderName + ' /WebManagerAddress=' + objCACIC.getWebManagerAddress + ' /MainProgramName=' + objCACIC.getMainProgramName + ' /MainProgramHash=' + objCACIC.getMainProgramHash,true,SW_HIDE) else - objCACIC.createOneProcess(objCACIC.getLocalFolderName + 'Modules\gercols.exe /'+p_acao+' /WebServicesFolderName='+objCACIC.getWebServicesFolderName +' /LocalFolderName='+objCACIC.getLocalFolderName + ' /WebManagerAddress=' + objCACIC.getWebManagerAddress + ' /MainProgramName=' + objCACIC.getMainProgramName + ' /MainProgramHash=' + objCACIC.getMainProgramHash,false,SW_HIDE); + objCACIC.createOneProcess(objCACIC.getLocalFolderName + 'Modules\gercols.exe /'+p_acao+' /WebServicesFolderName='+objCACIC.getWebServicesFolderName +' /LocalFolderName='+objCACIC.getLocalFolderName + ' /WebManagerAddress=' + objCACIC.getWebManagerAddress + ' /MainProgramName=' + objCACIC.getMainProgramName + ' /MainProgramHash=' + objCACIC.getMainProgramHash,true,SW_HIDE); g_intStatus := 1; objCacic.setBoolCipher(not objCacic.isInDebugMode); End @@ -1290,7 +1335,7 @@ begin objCacic.writeDailyLog('Invoca_MapaCacic: Criando processo mapa.'); objCACIC.writeDebugLog('Invoca_MapaCacic: Criando Processo Mapa => "'+objCACIC.getLocalFolderName + 'Modules\MapaCACIC.exe'); sleep(10000); //Pausa para dar tempo de realizar o login na máquina, senão o usuário fica em branco. - if (objCACIC.createOneProcess(objCACIC.getLocalFolderName + 'Modules\mapacacic.exe',false,SW_NORMAL)) then + if (objCACIC.createOneProcess(objCACIC.getLocalFolderName + 'Modules\mapacacic.exe',false,SW_SHOW)) then objCacic.writeDailyLog('Invoca_MapaCacic: Processo criado.') else objCacic.writeDailyLog('Invoca_MapaCacic: Falha ao criar processo.'); @@ -1327,11 +1372,13 @@ end; procedure TFormularioGeral.ExecutaCACIC(Sender: TObject); var v_mensagem, v_tipo_mensagem, + primeira_execucao, v_TE_FILA_FTP : string; v_MsgDlgType : TMsgDlgType; intTentativas : integer; begin try + primeira_execucao := FormatDateTime('yyyymmdd', Now); if FindCmdLineSwitch('execute', True) or FindCmdLineSwitch('atualizacao', True) or @@ -1374,9 +1421,14 @@ begin //////////////////////////////////////////////////////////////////////////////// // CRIADO PARA TESTAR A CHAMADA DO MAPA CACIC // //////////////////////////////////////////////////////////////////////////////// - if (trim(objCACIC.getValueFromFile('Configs','col_patr_exe', strGerColsInfFileName))<>'s') + if not FindCmdLineSwitch('atualizacao', True) and + (trim(objCACIC.getValueFromFile('Configs','col_patr_exe', strGerColsInfFileName))<>'s') and not (FileExists(objCacic.getLocalFolderName + 'Temp\aguarde_MAPACACIC.txt')) - and (objCACIC.getValueFromFile('Configs', 'modulo_patr', strGerColsInfFileName) = 'S') then begin + and (objCACIC.getValueFromFile('Configs', 'modulo_patr', strGerColsInfFileName) = 'S') + and ((objCACIC.getValueFromFile('Configs','primeira_execucao', + objCacic.getLocalFolderName + 'cacic280.inf') <> + primeira_execucao) and bl_primeira_execucao) then + begin objCACIC.writeDebugLog('ExecutaCACIC: Executa chamada ao Mapa Cacic...'); Invoca_MapaCacic; end; @@ -1481,6 +1533,9 @@ begin objCACIC.writeExceptionLog(E.Message,E.ClassName,'PROBLEMAS AO TENTAR ATIVAR COLETAS.'); end; objCACIC.writeDebugLog('ExecutaCACIC: ' + DupeString('=',100)); + objCacic.setValueToFile('Configs','primeira_execucao', primeira_execucao, + objCacic.getLocalFolderName + 'cacic280.inf'); + bl_primeira_execucao := false; end; procedure TFormularioGeral.ExecutarMapa1DrawItem(Sender: TObject; -- libgit2 0.21.2