module Facter::Util::Windows::Process
Constants
- SM_SERVERR2
- STATUS_SUCCESS
- TOKEN_INFORMATION_CLASS
msdn.microsoft.com/en-us/library/windows/desktop/aa379626(v=vs.85).aspx
- TOKEN_QUERY
Public Class Methods
elevated_security?()
click to toggle source
Returns whether or not the owner of the current process is running with elevated security privileges.
Only supported on Windows Vista or later.
# File lib/facter/util/windows/process.rb, line 78 def elevated_security? # default / pre-Vista elevated = false handle = nil begin handle = get_current_process open_process_token(handle, TOKEN_QUERY) do |token_handle| get_token_information(token_handle, :TokenElevation) do |token_info| token_elevation = parse_token_information_as_token_elevation(token_info) # TokenIsElevated member of the TOKEN_ELEVATION struct elevated = token_elevation[:TokenIsElevated] != 0 end end elevated rescue Facter::Util::Windows::Error => e raise e if e.code != ERROR_NO_SUCH_PRIVILEGE ensure Facter::Util::Windows::FFI::WIN32.CloseHandle(handle) if handle end end
get_current_process()
click to toggle source
# File lib/facter/util/windows/process.rb, line 7 def get_current_process # this pseudo-handle does not require closing per MSDN docs GetCurrentProcess() end
get_token_information(token_handle, token_information) { |token_information_buf| ... }
click to toggle source
# File lib/facter/util/windows/process.rb, line 36 def get_token_information(token_handle, token_information, &block) # to determine buffer size FFI::MemoryPointer.new(:dword, 1) do |return_length_ptr| result = GetTokenInformation(token_handle, token_information, nil, 0, return_length_ptr) return_length = Facter::Util::Windows::FFI.read_dword(return_length_ptr) if return_length <= 0 raise Facter::Util::Windows::Error.new( "GetTokenInformation(#{token_handle}, #{token_information}, nil, 0, #{return_length_ptr})") end # re-call API with properly sized buffer for all results FFI::MemoryPointer.new(return_length) do |token_information_buf| result = GetTokenInformation(token_handle, token_information, token_information_buf, return_length, return_length_ptr) if result == Facter::Util::Windows::FFI::WIN32_FALSE raise Facter::Util::Windows::Error.new( "GetTokenInformation(#{token_handle}, #{token_information}, #{token_information_buf}, " + "#{return_length}, #{return_length_ptr})") end yield token_information_buf end end # GetTokenInformation buffer has been cleaned up by this point, nothing to return nil end
is_2003_r2?()
click to toggle source
# File lib/facter/util/windows/process.rb, line 147 def is_2003_r2? # Peculiar API from user32 - the docs for SM_SERVER2 indicate # The build number if the system is Windows Server 2003 R2; otherwise, 0. GetSystemMetrics(SM_SERVERR2) != 0 end
open_process_token(handle, desired_access) { |token_handle = read_handle| ... }
click to toggle source
# File lib/facter/util/windows/process.rb, line 13 def open_process_token(handle, desired_access, &block) token_handle = nil begin FFI::MemoryPointer.new(:handle, 1) do |token_handle_ptr| result = OpenProcessToken(handle, desired_access, token_handle_ptr) if result == Facter::Util::Windows::FFI::WIN32_FALSE raise Facter::Util::Windows::Error.new( "OpenProcessToken(#{handle}, #{desired_access.to_s(8)}, #{token_handle_ptr})") end yield token_handle = Facter::Util::Windows::FFI.read_handle(token_handle_ptr) end token_handle ensure Facter::Util::Windows::FFI::WIN32.CloseHandle(token_handle) if token_handle end # token_handle has had CloseHandle called against it, so nothing to return nil end
os_version() { |ver| ... }
click to toggle source
# File lib/facter/util/windows/process.rb, line 104 def os_version(&block) FFI::MemoryPointer.new(OSVERSIONINFOEX.size) do |ver_ptr| ver = OSVERSIONINFOEX.new(ver_ptr) ver[:dwOSVersionInfoSize] = OSVERSIONINFOEX.size result = RtlGetVersion(ver_ptr) if result != STATUS_SUCCESS raise RuntimeError, 'Calling Windows RtlGetVersion failed' end yield ver end # ver_ptr has already had free called, so nothing to return nil end
os_version_string()
click to toggle source
# File lib/facter/util/windows/process.rb, line 134 def os_version_string ver = '' self.os_version do |version| ver = "#{version[:dwMajorVersion]}.#{version[:dwMinorVersion]}.#{version[:dwBuildNumber]}" end ver end
parse_token_information_as_token_elevation(token_information_buf)
click to toggle source
# File lib/facter/util/windows/process.rb, line 67 def parse_token_information_as_token_elevation(token_information_buf) TOKEN_ELEVATION.new(token_information_buf) end
supports_elevated_security?()
click to toggle source
# File lib/facter/util/windows/process.rb, line 154 def supports_elevated_security? windows_major_version >= 6 end
windows_major_version()
click to toggle source
# File lib/facter/util/windows/process.rb, line 123 def windows_major_version ver = 0 self.os_version do |version| ver = version[:dwMajorVersion] end ver end
Private Instance Methods
elevated_security?()
click to toggle source
Returns whether or not the owner of the current process is running with elevated security privileges.
Only supported on Windows Vista or later.
# File lib/facter/util/windows/process.rb, line 78 def elevated_security? # default / pre-Vista elevated = false handle = nil begin handle = get_current_process open_process_token(handle, TOKEN_QUERY) do |token_handle| get_token_information(token_handle, :TokenElevation) do |token_info| token_elevation = parse_token_information_as_token_elevation(token_info) # TokenIsElevated member of the TOKEN_ELEVATION struct elevated = token_elevation[:TokenIsElevated] != 0 end end elevated rescue Facter::Util::Windows::Error => e raise e if e.code != ERROR_NO_SUCH_PRIVILEGE ensure Facter::Util::Windows::FFI::WIN32.CloseHandle(handle) if handle end end
get_current_process()
click to toggle source
# File lib/facter/util/windows/process.rb, line 7 def get_current_process # this pseudo-handle does not require closing per MSDN docs GetCurrentProcess() end
get_token_information(token_handle, token_information) { |token_information_buf| ... }
click to toggle source
# File lib/facter/util/windows/process.rb, line 36 def get_token_information(token_handle, token_information, &block) # to determine buffer size FFI::MemoryPointer.new(:dword, 1) do |return_length_ptr| result = GetTokenInformation(token_handle, token_information, nil, 0, return_length_ptr) return_length = Facter::Util::Windows::FFI.read_dword(return_length_ptr) if return_length <= 0 raise Facter::Util::Windows::Error.new( "GetTokenInformation(#{token_handle}, #{token_information}, nil, 0, #{return_length_ptr})") end # re-call API with properly sized buffer for all results FFI::MemoryPointer.new(return_length) do |token_information_buf| result = GetTokenInformation(token_handle, token_information, token_information_buf, return_length, return_length_ptr) if result == Facter::Util::Windows::FFI::WIN32_FALSE raise Facter::Util::Windows::Error.new( "GetTokenInformation(#{token_handle}, #{token_information}, #{token_information_buf}, " + "#{return_length}, #{return_length_ptr})") end yield token_information_buf end end # GetTokenInformation buffer has been cleaned up by this point, nothing to return nil end
is_2003_r2?()
click to toggle source
# File lib/facter/util/windows/process.rb, line 147 def is_2003_r2? # Peculiar API from user32 - the docs for SM_SERVER2 indicate # The build number if the system is Windows Server 2003 R2; otherwise, 0. GetSystemMetrics(SM_SERVERR2) != 0 end
open_process_token(handle, desired_access) { |token_handle = read_handle| ... }
click to toggle source
# File lib/facter/util/windows/process.rb, line 13 def open_process_token(handle, desired_access, &block) token_handle = nil begin FFI::MemoryPointer.new(:handle, 1) do |token_handle_ptr| result = OpenProcessToken(handle, desired_access, token_handle_ptr) if result == Facter::Util::Windows::FFI::WIN32_FALSE raise Facter::Util::Windows::Error.new( "OpenProcessToken(#{handle}, #{desired_access.to_s(8)}, #{token_handle_ptr})") end yield token_handle = Facter::Util::Windows::FFI.read_handle(token_handle_ptr) end token_handle ensure Facter::Util::Windows::FFI::WIN32.CloseHandle(token_handle) if token_handle end # token_handle has had CloseHandle called against it, so nothing to return nil end
os_version() { |ver| ... }
click to toggle source
# File lib/facter/util/windows/process.rb, line 104 def os_version(&block) FFI::MemoryPointer.new(OSVERSIONINFOEX.size) do |ver_ptr| ver = OSVERSIONINFOEX.new(ver_ptr) ver[:dwOSVersionInfoSize] = OSVERSIONINFOEX.size result = RtlGetVersion(ver_ptr) if result != STATUS_SUCCESS raise RuntimeError, 'Calling Windows RtlGetVersion failed' end yield ver end # ver_ptr has already had free called, so nothing to return nil end
os_version_string()
click to toggle source
# File lib/facter/util/windows/process.rb, line 134 def os_version_string ver = '' self.os_version do |version| ver = "#{version[:dwMajorVersion]}.#{version[:dwMinorVersion]}.#{version[:dwBuildNumber]}" end ver end
parse_token_information_as_token_elevation(token_information_buf)
click to toggle source
# File lib/facter/util/windows/process.rb, line 67 def parse_token_information_as_token_elevation(token_information_buf) TOKEN_ELEVATION.new(token_information_buf) end
supports_elevated_security?()
click to toggle source
# File lib/facter/util/windows/process.rb, line 154 def supports_elevated_security? windows_major_version >= 6 end
windows_major_version()
click to toggle source
# File lib/facter/util/windows/process.rb, line 123 def windows_major_version ver = 0 self.os_version do |version| ver = version[:dwMajorVersion] end ver end