Module: Puppet::Util::Windows::ADSI

Extended by:
FFI::Library
Defined in:
lib/puppet/util/windows.rb,
lib/puppet/util/windows/adsi.rb

Defined Under Namespace

Classes: ADSIObject, Group, User, UserProfile

Constant Summary collapse

STANDALONE_WORKSTATION =
0
MEMBER_WORKSTATION =
1
STANDALONE_SERVER =
2
MEMBER_SERVER =
3
BACKUP_DOMAIN_CONTROLLER =
4
PRIMARY_DOMAIN_CONTROLLER =
5
DOMAIN_ROLES =
{
  STANDALONE_WORKSTATION => :STANDALONE_WORKSTATION,
  MEMBER_WORKSTATION => :MEMBER_WORKSTATION,
  STANDALONE_SERVER => :STANDALONE_SERVER,
  MEMBER_SERVER => :MEMBER_SERVER,
  BACKUP_DOMAIN_CONTROLLER => :BACKUP_DOMAIN_CONTROLLER,
  PRIMARY_DOMAIN_CONTROLLER => :PRIMARY_DOMAIN_CONTROLLER,
}
MAX_COMPUTERNAME_LENGTH =

taken from winbase.h

31

Class Method Summary collapse

Methods included from FFI::Library

attach_function_private

Class Method Details

.computer_nameObject


51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/puppet/util/windows/adsi.rb', line 51

def computer_name
  unless @computer_name
    max_length = MAX_COMPUTERNAME_LENGTH + 1 # NULL terminated
    FFI::MemoryPointer.new(max_length * 2) do |buffer| # wide string
      FFI::MemoryPointer.new(:dword, 1) do |buffer_size|
        buffer_size.write_dword(max_length) # length in TCHARs

        if GetComputerNameW(buffer, buffer_size) == FFI::WIN32_FALSE
          raise Puppet::Util::Windows::Error.new(_("Failed to get computer name"))
        end
        @computer_name = buffer.read_wide_string(buffer_size.read_dword)
      end
    end
  end
  @computer_name
end

.computer_uri(host = '.') ⇒ Object


68
69
70
# File 'lib/puppet/util/windows/adsi.rb', line 68

def computer_uri(host = '.')
  "WinNT://#{host}"
end

.connect(uri) ⇒ Object


32
33
34
35
36
37
38
# File 'lib/puppet/util/windows/adsi.rb', line 32

def connect(uri)
  begin
    WIN32OLE.connect(uri)
  rescue WIN32OLERuntimeError => e
    raise Puppet::Error.new( _("ADSI connection error: %{e}") % { e: e }, e )
  end
end

.connectable?(uri) ⇒ Boolean

Returns:

  • (Boolean)

24
25
26
27
28
29
30
# File 'lib/puppet/util/windows/adsi.rb', line 24

def connectable?(uri)
  begin
    !! connect(uri)
  rescue
    false
  end
end

.create(name, resource_type) ⇒ Object


40
41
42
# File 'lib/puppet/util/windows/adsi.rb', line 40

def create(name, resource_type)
  Puppet::Util::Windows::ADSI.connect(computer_uri).Create(resource_type, name)
end

.delete(name, resource_type) ⇒ Object


44
45
46
# File 'lib/puppet/util/windows/adsi.rb', line 44

def delete(name, resource_type)
  Puppet::Util::Windows::ADSI.connect(computer_uri).Delete(resource_type, name)
end

.domain_roleObject


114
115
116
117
118
119
120
# File 'lib/puppet/util/windows/adsi.rb', line 114

def domain_role
  unless @domain_role
    query_result = Puppet::Util::Windows::ADSI.execquery('select DomainRole from Win32_ComputerSystem').to_enum.first
    @domain_role = DOMAIN_ROLES[query_result.DomainRole] if query_result
  end
  @domain_role
end

.execquery(query) ⇒ Object


110
111
112
# File 'lib/puppet/util/windows/adsi.rb', line 110

def execquery(query)
  wmi_connection.execquery(query)
end

.sid_uri(sid) ⇒ Object

This method should only be used to generate WinNT://<SID> style monikers used for IAdsGroup::Add / IAdsGroup::Remove. These URIs are not useable to resolve an account with WIN32OLE.connect

Raises:


96
97
98
99
100
# File 'lib/puppet/util/windows/adsi.rb', line 96

def sid_uri(sid)
  raise Puppet::Error.new( _("Must use a valid SID::Principal") ) if !sid.kind_of?(Puppet::Util::Windows::SID::Principal)

  "WinNT://#{sid.sid}"
end

.sid_uri_safe(sid) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This method should only be used to generate WinNT://<SID> style monikers used for IAdsGroup::Add / IAdsGroup::Remove. These URIs are not usable to resolve an account with WIN32OLE.connect Valid input is a SID::Principal, S-X-X style SID string or any valid account name with or without domain prefix


82
83
84
85
86
87
88
89
90
91
# File 'lib/puppet/util/windows/adsi.rb', line 82

def sid_uri_safe(sid)
  return sid_uri(sid) if sid.kind_of?(Puppet::Util::Windows::SID::Principal)

  begin
    sid = Puppet::Util::Windows::SID.name_to_principal(sid)
    sid_uri(sid)
  rescue Puppet::Util::Windows::Error, Puppet::Error
    nil
  end
end

.uri(resource_name, resource_type, host = '.') ⇒ Object


102
103
104
# File 'lib/puppet/util/windows/adsi.rb', line 102

def uri(resource_name, resource_type, host = '.')
  "#{computer_uri(host)}/#{resource_name},#{resource_type}"
end

.wmi_connectionObject


106
107
108
# File 'lib/puppet/util/windows/adsi.rb', line 106

def wmi_connection
  connect(wmi_resource_uri)
end

.wmi_resource_uri(host = '.') ⇒ Object


72
73
74
# File 'lib/puppet/util/windows/adsi.rb', line 72

def wmi_resource_uri( host = '.' )
  "winmgmts:{impersonationLevel=impersonate}!//#{host}/root/cimv2"
end