Merge branch 'ent-1404-no-estan-funcionando-correctamente-los-watchdog-de-procesos-windows' into 'develop'
Added module_user_session token to module_proc on windows agent See merge request artica/pandorafms!916
This commit is contained in:
commit
8a39b25ee0
|
@ -123,6 +123,7 @@ using namespace Pandora_Strutils;
|
||||||
#define TOKEN_MACRO ("module_macro")
|
#define TOKEN_MACRO ("module_macro")
|
||||||
#define TOKEN_NATIVE_ENCODING ("module_native_encoding")
|
#define TOKEN_NATIVE_ENCODING ("module_native_encoding")
|
||||||
#define TOKEN_ALERT_TEMPLATE ("module_alert_template")
|
#define TOKEN_ALERT_TEMPLATE ("module_alert_template")
|
||||||
|
#define TOKEN_USER_SESSION ("module_user_session ")
|
||||||
|
|
||||||
string
|
string
|
||||||
parseLine (string line, string token) {
|
parseLine (string line, string token) {
|
||||||
|
@ -161,7 +162,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
||||||
string module_logevent, module_source, module_eventtype, module_eventcode;
|
string module_logevent, module_source, module_eventtype, module_eventcode;
|
||||||
string module_logchannel;
|
string module_logchannel;
|
||||||
string module_pattern, module_application, module_async;
|
string module_pattern, module_application, module_async;
|
||||||
string module_watchdog, module_start_command;
|
string module_watchdog, module_start_command, module_user_session;
|
||||||
string module_wmiquery, module_wmicolumn;
|
string module_wmiquery, module_wmicolumn;
|
||||||
string module_retries, module_startdelay, module_retrydelay;
|
string module_retries, module_startdelay, module_retrydelay;
|
||||||
string module_perfcounter, module_tcpcheck;
|
string module_perfcounter, module_tcpcheck;
|
||||||
|
@ -257,6 +258,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
||||||
module_ff_interval = "";
|
module_ff_interval = "";
|
||||||
module_native_encoding = "";
|
module_native_encoding = "";
|
||||||
module_alert_template = "";
|
module_alert_template = "";
|
||||||
|
module_user_session = "";
|
||||||
macro = "";
|
macro = "";
|
||||||
|
|
||||||
stringtok (tokens, definition, "\n");
|
stringtok (tokens, definition, "\n");
|
||||||
|
@ -516,6 +518,10 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
||||||
module_alert_template.erase (0,1);
|
module_alert_template.erase (0,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (module_user_session == "") {
|
||||||
|
module_user_session = parseLine (line, TOKEN_USER_SESSION);
|
||||||
|
}
|
||||||
|
|
||||||
if (macro == "") {
|
if (macro == "") {
|
||||||
macro = parseLine (line, TOKEN_MACRO);
|
macro = parseLine (line, TOKEN_MACRO);
|
||||||
|
|
||||||
|
@ -1099,6 +1105,13 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
||||||
module_alert_template.replace(pos_macro, macro_name.size(), macro_value);
|
module_alert_template.replace(pos_macro, macro_name.size(), macro_value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (module_user_session != "") {
|
||||||
|
pos_macro = module_user_session.find(macro_name);
|
||||||
|
if (pos_macro != string::npos){
|
||||||
|
module_user_session.replace(pos_macro, macro_name.size(), macro_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1135,6 +1148,7 @@ Pandora_Module_Factory::getModuleFromDefinition (string definition) {
|
||||||
module_proc->setRetries (atoi(module_retries.c_str ()));
|
module_proc->setRetries (atoi(module_retries.c_str ()));
|
||||||
module_proc->setStartDelay (atoi(module_startdelay.c_str ()));
|
module_proc->setStartDelay (atoi(module_startdelay.c_str ()));
|
||||||
module_proc->setRetryDelay (atoi(module_retrydelay.c_str ()));
|
module_proc->setRetryDelay (atoi(module_retrydelay.c_str ()));
|
||||||
|
module_proc->setUserSession (is_enabled(module_user_session));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (module_service != "") {
|
} else if (module_service != "") {
|
||||||
|
|
|
@ -48,6 +48,7 @@ Pandora_Module_Proc::Pandora_Module_Proc (string name, string process_name)
|
||||||
this->setKind (module_proc_str);
|
this->setKind (module_proc_str);
|
||||||
|
|
||||||
this->watchdog = false;
|
this->watchdog = false;
|
||||||
|
this->user_session = false;
|
||||||
this->start_command = "";
|
this->start_command = "";
|
||||||
this->retries = 3;
|
this->retries = 3;
|
||||||
this->start_delay = 5000;
|
this->start_delay = 5000;
|
||||||
|
@ -95,6 +96,11 @@ Pandora_Module_Proc::getRetryDelay () const {
|
||||||
return this->retry_delay;
|
return this->retry_delay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Pandora_Module_Proc::getUserSession () const {
|
||||||
|
return this->user_session;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Pandora_Module_Proc::setWatchdog (bool watchdog) {
|
Pandora_Module_Proc::setWatchdog (bool watchdog) {
|
||||||
this->watchdog = watchdog;
|
this->watchdog = watchdog;
|
||||||
|
@ -131,6 +137,11 @@ Pandora_Module_Proc::setRetryDelay (int mseconds) {
|
||||||
this->retry_delay = mseconds;
|
this->retry_delay = mseconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Pandora_Module_Proc::setUserSession (bool usession) {
|
||||||
|
this->user_session = usession;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
async_run (Pandora_Module_Proc *module) {
|
async_run (Pandora_Module_Proc *module) {
|
||||||
HANDLE *processes = NULL;
|
HANDLE *processes = NULL;
|
||||||
|
@ -156,7 +167,7 @@ async_run (Pandora_Module_Proc *module) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Sleep (module->getRetryDelay ());
|
Sleep (module->getRetryDelay ());
|
||||||
Pandora_Wmi::runProgram (module->getStartCommand ());
|
Pandora_Wmi::runProgram (module->getStartCommand (), NULL, module->getUserSession());
|
||||||
Sleep (module->getStartDelay ());
|
Sleep (module->getStartDelay ());
|
||||||
counter++;
|
counter++;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -32,6 +32,7 @@ namespace Pandora_Modules {
|
||||||
string process_name;
|
string process_name;
|
||||||
HANDLE thread;
|
HANDLE thread;
|
||||||
bool watchdog;
|
bool watchdog;
|
||||||
|
bool user_session;
|
||||||
string start_command;
|
string start_command;
|
||||||
int retries;
|
int retries;
|
||||||
int start_delay;
|
int start_delay;
|
||||||
|
@ -46,12 +47,14 @@ namespace Pandora_Modules {
|
||||||
int getRetries () const;
|
int getRetries () const;
|
||||||
int getStartDelay () const;
|
int getStartDelay () const;
|
||||||
int getRetryDelay () const;
|
int getRetryDelay () const;
|
||||||
|
bool getUserSession () const;
|
||||||
|
|
||||||
void setWatchdog (bool watchdog);
|
void setWatchdog (bool watchdog);
|
||||||
void setStartCommand (string command);
|
void setStartCommand (string command);
|
||||||
void setRetries (int retries);
|
void setRetries (int retries);
|
||||||
void setStartDelay (int mseconds);
|
void setStartDelay (int mseconds);
|
||||||
void setRetryDelay (int mseconds);
|
void setRetryDelay (int mseconds);
|
||||||
|
void setUserSession (bool usession);
|
||||||
|
|
||||||
void run ();
|
void run ();
|
||||||
};
|
};
|
||||||
|
|
|
@ -501,7 +501,7 @@ Pandora_Wmi::getSystemName () {
|
||||||
* @param flags Process creation flags
|
* @param flags Process creation flags
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
Pandora_Wmi::runProgram (string command, DWORD flags) {
|
Pandora_Wmi::runProgram (string command, DWORD flags, BOOL user_session) {
|
||||||
PROCESS_INFORMATION process_info;
|
PROCESS_INFORMATION process_info;
|
||||||
STARTUPINFO startup_info;
|
STARTUPINFO startup_info;
|
||||||
bool success;
|
bool success;
|
||||||
|
@ -514,11 +514,75 @@ Pandora_Wmi::runProgram (string command, DWORD flags) {
|
||||||
startup_info.cb = sizeof (startup_info);
|
startup_info.cb = sizeof (startup_info);
|
||||||
ZeroMemory (&process_info, sizeof (process_info));
|
ZeroMemory (&process_info, sizeof (process_info));
|
||||||
|
|
||||||
|
if (user_session) {
|
||||||
|
DWORD sessionId = WTSGetActiveConsoleSessionId();
|
||||||
|
startup_info.cb = sizeof(STARTUPINFO);
|
||||||
|
startup_info.hStdError = 0;
|
||||||
|
startup_info.hStdInput = 0;
|
||||||
|
startup_info.hStdOutput = 0;
|
||||||
|
if (
|
||||||
|
startup_info.hStdError != 0
|
||||||
|
|| startup_info.hStdInput != 0
|
||||||
|
|| startup_info.hStdOutput != 0
|
||||||
|
) {
|
||||||
|
startup_info.dwFlags |= STARTF_USESTDHANDLES;
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE procHandle = GetCurrentProcess();
|
||||||
|
HANDLE token, userToken;
|
||||||
|
|
||||||
|
// Tray to open the process
|
||||||
|
if (OpenProcessToken(procHandle, TOKEN_DUPLICATE, &token) == 0) {
|
||||||
|
pandoraDebug ("Open Process Token fails with error %d.", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Duplicate token
|
||||||
|
if (DuplicateTokenEx(token,
|
||||||
|
MAXIMUM_ALLOWED,
|
||||||
|
0,
|
||||||
|
SecurityImpersonation,
|
||||||
|
TokenPrimary,
|
||||||
|
&userToken) == 0) {
|
||||||
|
pandoraDebug ("Duplicate token fails with error %d.", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Token Information
|
||||||
|
if (SetTokenInformation(userToken,
|
||||||
|
(TOKEN_INFORMATION_CLASS)TokenSessionId,
|
||||||
|
&sessionId,
|
||||||
|
sizeof(sessionId)) == 0) {
|
||||||
|
// Error 1314 will be thrown if agent is not running as service.
|
||||||
|
if (GetLastError() != 1314) {
|
||||||
|
pandoraDebug ("Set token information fails with error %d.", GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LPSTR command_exec = (LPSTR)command.c_str();
|
||||||
|
|
||||||
|
// Create Process As User
|
||||||
|
// Changed inherit and command
|
||||||
|
success = CreateProcessAsUser(
|
||||||
|
userToken,
|
||||||
|
0,
|
||||||
|
command_exec,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
FALSE,
|
||||||
|
flags,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
&startup_info,
|
||||||
|
&process_info);
|
||||||
|
} else {
|
||||||
pandoraDebug ("Start process \"%s\".", command.c_str ());
|
pandoraDebug ("Start process \"%s\".", command.c_str ());
|
||||||
cmd = strdup (command.c_str ());
|
cmd = strdup (command.c_str ());
|
||||||
success = CreateProcess (NULL, cmd, NULL, NULL, FALSE, flags,
|
success = CreateProcess (NULL, cmd, NULL, NULL, FALSE, flags,
|
||||||
NULL, NULL, &startup_info, &process_info);
|
NULL, NULL, &startup_info, &process_info);
|
||||||
pandoraFree (cmd);
|
pandoraFree (cmd);
|
||||||
|
}
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
pandoraDebug ("The process \"%s\" was started.", command.c_str ());
|
pandoraDebug ("The process \"%s\" was started.", command.c_str ());
|
||||||
|
|
|
@ -53,7 +53,7 @@ namespace Pandora_Wmi {
|
||||||
string getOSBuild ();
|
string getOSBuild ();
|
||||||
string getSystemName ();
|
string getSystemName ();
|
||||||
string getSystemAddress ();
|
string getSystemAddress ();
|
||||||
bool runProgram (string command, DWORD flags = 0);
|
bool runProgram (string command, DWORD flags = 0, BOOL user_session = false);
|
||||||
bool startService (string service_name);
|
bool startService (string service_name);
|
||||||
bool stopService (string service_name);
|
bool stopService (string service_name);
|
||||||
void runWMIQuery (string wmi_query,
|
void runWMIQuery (string wmi_query,
|
||||||
|
|
Loading…
Reference in New Issue