module Facter::Util::Windows::User

Constants

SECURITY_MAX_SID_SIZE

msdn.microsoft.com/en-us/library/windows/desktop/ee207397(v=vs.85).aspx

WELL_KNOWN_SID_TYPE

msdn.microsoft.com/en-us/library/windows/desktop/aa379650(v=vs.85).aspx

Public Class Methods

admin?() click to toggle source
# File lib/facter/util/windows/user.rb, line 7
def admin?
  elevated_supported = Facter::Util::Windows::Process.supports_elevated_security?

  # if Vista or later, check for unrestricted process token

  return Facter::Util::Windows::Process.elevated_security? if elevated_supported

  # otherwise 2003 or less

  check_token_membership
end
check_token_membership() click to toggle source
# File lib/facter/util/windows/user.rb, line 22
def check_token_membership
  is_admin = false
  FFI::MemoryPointer.new(:byte, SECURITY_MAX_SID_SIZE) do |sid_pointer|
    FFI::MemoryPointer.new(:dword, 1) do |size_pointer|
      size_pointer.write_uint32(SECURITY_MAX_SID_SIZE)

      if CreateWellKnownSid(:WinBuiltinAdministratorsSid, FFI::Pointer::NULL, sid_pointer, size_pointer) == Facter::Util::Windows::FFI::WIN32_FALSE
        raise Facter::Util::Windows::Error.new("Failed to create administrators SID")
      end
    end

    if IsValidSid(sid_pointer) == Facter::Util::Windows::FFI::WIN32_FALSE
      raise RuntimeError,"Invalid SID"
    end

    FFI::MemoryPointer.new(:win32_bool, 1) do |ismember_pointer|
      if CheckTokenMembership(Facter::Util::Windows::FFI::NULL_HANDLE, sid_pointer, ismember_pointer) == Facter::Util::Windows::FFI::WIN32_FALSE
        raise Facter::Util::Windows::Error.new("Failed to check membership")
      end

      # Is administrators SID enabled in calling thread's access token?

      is_admin = Facter::Util::Windows::FFI.read_win32_bool(ismember_pointer)
    end
  end

  is_admin
end

Private Instance Methods

admin?() click to toggle source
# File lib/facter/util/windows/user.rb, line 7
def admin?
  elevated_supported = Facter::Util::Windows::Process.supports_elevated_security?

  # if Vista or later, check for unrestricted process token

  return Facter::Util::Windows::Process.elevated_security? if elevated_supported

  # otherwise 2003 or less

  check_token_membership
end
check_token_membership() click to toggle source
# File lib/facter/util/windows/user.rb, line 22
def check_token_membership
  is_admin = false
  FFI::MemoryPointer.new(:byte, SECURITY_MAX_SID_SIZE) do |sid_pointer|
    FFI::MemoryPointer.new(:dword, 1) do |size_pointer|
      size_pointer.write_uint32(SECURITY_MAX_SID_SIZE)

      if CreateWellKnownSid(:WinBuiltinAdministratorsSid, FFI::Pointer::NULL, sid_pointer, size_pointer) == Facter::Util::Windows::FFI::WIN32_FALSE
        raise Facter::Util::Windows::Error.new("Failed to create administrators SID")
      end
    end

    if IsValidSid(sid_pointer) == Facter::Util::Windows::FFI::WIN32_FALSE
      raise RuntimeError,"Invalid SID"
    end

    FFI::MemoryPointer.new(:win32_bool, 1) do |ismember_pointer|
      if CheckTokenMembership(Facter::Util::Windows::FFI::NULL_HANDLE, sid_pointer, ismember_pointer) == Facter::Util::Windows::FFI::WIN32_FALSE
        raise Facter::Util::Windows::Error.new("Failed to check membership")
      end

      # Is administrators SID enabled in calling thread's access token?

      is_admin = Facter::Util::Windows::FFI.read_win32_bool(ismember_pointer)
    end
  end

  is_admin
end