diff options
author | Like Ma <likemartinma@gmail.com> | 2017-04-16 22:18:49 +0800 |
---|---|---|
committer | Like Ma <likemartinma@gmail.com> | 2019-01-30 21:44:22 +0800 |
commit | 1527043b14f0a14cc663b8f47b3fdb8bec86705a (patch) | |
tree | 9e5bd54d02d0cff047440c3b430fb807fe31213f /ACE/ace/Process.cpp | |
parent | 59fb63edb14fbd9c45a269d7f41ada12142e0afc (diff) | |
download | ATCD-1527043b14f0a14cc663b8f47b3fdb8bec86705a.tar.gz |
Support specifying user token in ACE_Process_Options for ::CreateProcessAsUser.
Diffstat (limited to 'ACE/ace/Process.cpp')
-rw-r--r-- | ACE/ace/Process.cpp | 62 |
1 files changed, 51 insertions, 11 deletions
diff --git a/ACE/ace/Process.cpp b/ACE/ace/Process.cpp index 7ca955db4e3..ced96c7e429 100644 --- a/ACE/ace/Process.cpp +++ b/ACE/ace/Process.cpp @@ -175,17 +175,34 @@ ACE_Process::spawn (ACE_Process_Options &options) } # endif - BOOL fork_result = - ACE_TEXT_CreateProcess (0, - options.command_line_buf (), - options.get_process_attributes (), - options.get_thread_attributes (), - options.handle_inheritance (), - flags, - env_buf, // environment variables - options.working_directory (), - options.startup_info (), - &this->process_info_); + BOOL fork_result; + if (options.get_user_token () == ACE_INVALID_HANDLE) + { + fork_result = ACE_TEXT_CreateProcess (0, + options.command_line_buf (), + options.get_process_attributes (), + options.get_thread_attributes (), + options.handle_inheritance (), + flags, + env_buf, // environment variables + options.working_directory (), + options.startup_info (), + &this->process_info_); + } + else + { + fork_result = ACE_TEXT_CreateProcessAsUser (options.get_user_token (), + 0, + options.command_line_buf (), + options.get_process_attributes (), + options.get_thread_attributes (), + options.handle_inheritance (), + flags, + env_buf, // environment variables + options.working_directory (), + options.startup_info (), + &this->process_info_); + } # if defined (ACE_HAS_WCHAR) && !defined (ACE_USES_WCHAR) if (options.use_unicode_environment ()) @@ -811,6 +828,8 @@ ACE_Process_Options::ACE_Process_Options (bool inherit_environment, environment_inherited_ (0), process_attributes_ (0), thread_attributes_ (0), + user_token_ (ACE_INVALID_HANDLE), + close_user_token_ (false), #else /* ACE_WIN32 */ stdin_ (ACE_INVALID_HANDLE), stdout_ (ACE_INVALID_HANDLE), @@ -1246,6 +1265,13 @@ ACE_Process_Options::~ACE_Process_Options (void) #else delete [] command_line_argv_; #endif /* ACE_HAS_ALLOC_HOOKS */ + +#if defined (ACE_WIN32) + if (user_token_ != ACE_INVALID_HANDLE && close_user_token_) + { + ::CloseHandle(user_token_); + } +#endif /* ACE_WIN32 */ } int @@ -1439,4 +1465,18 @@ ACE_Managed_Process::unmanage (void) delete this; } +#if defined (ACE_WIN32) +void +ACE_Process_Options::set_user_token (HANDLE token, bool close_token) +{ + if (user_token_ != ACE_INVALID_HANDLE && close_user_token_) + { + ::CloseHandle(user_token_); + } + + user_token_ = token; + close_user_token_ = close_token; +} +#endif /* ACE_WIN32 */ + ACE_END_VERSIONED_NAMESPACE_DECL |