Class: Puppet::Util::ADSI::User

Inherits:
Object
  • Object
show all
Extended by:
Enumerable
Defined in:
lib/puppet/util/adsi.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, native_user = nil) ⇒ User

Returns a new instance of User.



70
71
72
73
# File 'lib/puppet/util/adsi.rb', line 70

def initialize(name, native_user = nil)
  @name = name
  @native_user = native_user
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



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

def name
  @name
end

#native_userObject

Returns the value of attribute native_user.



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

def native_user
  @native_user
end

Class Method Details

.create(name) ⇒ Object

Raises:



177
178
179
180
181
# File 'lib/puppet/util/adsi.rb', line 177

def self.create(name)
  # Windows error 1379: The specified local group already exists.
  raise Puppet::Error.new( "Cannot create user if group '#{name}' exists." ) if Puppet::Util::ADSI::Group.exists? name
  new(name, Puppet::Util::ADSI.create(name, 'user'))
end

.delete(name) ⇒ Object



187
188
189
# File 'lib/puppet/util/adsi.rb', line 187

def self.delete(name)
  Puppet::Util::ADSI.delete(name, 'user')
end

.each(&block) ⇒ Object



191
192
193
194
195
196
197
198
199
200
# File 'lib/puppet/util/adsi.rb', line 191

def self.each(&block)
  wql = Puppet::Util::ADSI.execquery("select * from win32_useraccount")

  users = []
  wql.each do |u|
    users << new(u.name, u)
  end

  users.each(&block)
end

.exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


183
184
185
# File 'lib/puppet/util/adsi.rb', line 183

def self.exists?(name)
  Puppet::Util::ADSI::connectable?(User.uri(name))
end

.logon(name, password) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/puppet/util/adsi.rb', line 87

def self.logon(name, password)
  fLOGON32_LOGON_NETWORK = 3
  fLOGON32_PROVIDER_DEFAULT = 0

  logon_user = Win32API.new("advapi32", "LogonUser", ['P', 'P', 'P', 'L', 'L', 'P'], 'L')
  close_handle = Win32API.new("kernel32", "CloseHandle", ['P'], 'V')

  token = ' ' * 4
  if logon_user.call(name, "", password, fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, token) != 0
    close_handle.call(token.unpack('L')[0])
    true
  else
    false
  end
end

.uri(name) ⇒ Object



79
80
81
# File 'lib/puppet/util/adsi.rb', line 79

def self.uri(name)
  Puppet::Util::ADSI.uri(name, 'user')
end

Instance Method Details

#[](attribute) ⇒ Object



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

def [](attribute)
  native_user.Get(attribute)
end

#[]=(attribute, value) ⇒ Object



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

def []=(attribute, value)
  native_user.Put(attribute, value)
end

#add_flag(flag_name, value) ⇒ Object



124
125
126
127
128
129
130
# File 'lib/puppet/util/adsi.rb', line 124

def add_flag(flag_name, value)
  flag = native_user.Get(flag_name) rescue 0

  native_user.Put(flag_name, flag | value)

  commit
end

#add_to_groups(*group_names) ⇒ Object Also known as: add_to_group



146
147
148
149
150
# File 'lib/puppet/util/adsi.rb', line 146

def add_to_groups(*group_names)
  group_names.each do |group_name|
    Puppet::Util::ADSI::Group.new(group_name).add_member(@name)
  end
end

#commitObject



111
112
113
114
115
116
117
118
# File 'lib/puppet/util/adsi.rb', line 111

def commit
  begin
    native_user.SetInfo unless native_user.nil?
  rescue Exception => e
    raise Puppet::Error.new( "User update failed: #{e}" )
  end
  self
end

#groupsObject



139
140
141
142
143
144
# File 'lib/puppet/util/adsi.rb', line 139

def groups
  # WIN32OLE objects aren't enumerable, so no map
  groups = []
  native_user.Groups.each {|g| groups << g.Name} rescue nil
  groups
end

#password=(password) ⇒ Object



132
133
134
135
136
137
# File 'lib/puppet/util/adsi.rb', line 132

def password=(password)
  native_user.SetPassword(password)
  commit
  fADS_UF_DONT_EXPIRE_PASSWD = 0x10000
  add_flag("UserFlags", fADS_UF_DONT_EXPIRE_PASSWD)
end

#password_is?(password) ⇒ Boolean

Returns:

  • (Boolean)


120
121
122
# File 'lib/puppet/util/adsi.rb', line 120

def password_is?(password)
  self.class.logon(name, password)
end

#remove_from_groups(*group_names) ⇒ Object Also known as: remove_from_group



153
154
155
156
157
# File 'lib/puppet/util/adsi.rb', line 153

def remove_from_groups(*group_names)
  group_names.each do |group_name|
    Puppet::Util::ADSI::Group.new(group_name).remove_member(@name)
  end
end

#set_groups(desired_groups, minimum = true) ⇒ Object



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/puppet/util/adsi.rb', line 160

def set_groups(desired_groups, minimum = true)
  return if desired_groups.nil? or desired_groups.empty?

  desired_groups = desired_groups.split(',').map(&:strip)

  current_groups = self.groups

  # First we add the user to all the groups it should be in but isn't
  groups_to_add = desired_groups - current_groups
  add_to_groups(*groups_to_add)

  # Then we remove the user from all groups it is in but shouldn't be, if
  # that's been requested
  groups_to_remove = current_groups - desired_groups
  remove_from_groups(*groups_to_remove) unless minimum
end

#uriObject



83
84
85
# File 'lib/puppet/util/adsi.rb', line 83

def uri
  self.class.uri(name)
end