Class: Puppet::Util::Windows::ADSI::Group

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, native_group = nil) ⇒ Group

Returns a new instance of Group.



305
306
307
308
# File 'lib/puppet/util/windows/adsi.rb', line 305

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

Instance Attribute Details

#nameObject (readonly)



304
305
306
# File 'lib/puppet/util/windows/adsi.rb', line 304

def name
  @name
end

#native_groupObject



303
304
305
# File 'lib/puppet/util/windows/adsi.rb', line 303

def native_group
  @native_group
end

#sidObject (readonly)



304
305
306
# File 'lib/puppet/util/windows/adsi.rb', line 304

def sid
  @sid
end

Class Method Details

.create(name) ⇒ Object

Raises:



405
406
407
408
409
# File 'lib/puppet/util/windows/adsi.rb', line 405

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

.delete(name) ⇒ Object



415
416
417
# File 'lib/puppet/util/windows/adsi.rb', line 415

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

.each(&block) ⇒ Object



419
420
421
422
423
424
425
426
427
428
# File 'lib/puppet/util/windows/adsi.rb', line 419

def self.each(&block)
  wql = Puppet::Util::Windows::ADSI.execquery( 'select name from win32_group where localaccount = "TRUE"' )

  groups = []
  wql.each do |g|
    groups << new(g.name)
  end

  groups.each(&block)
end

.exists?(name) ⇒ Boolean

Returns:

  • (Boolean)


411
412
413
# File 'lib/puppet/util/windows/adsi.rb', line 411

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

.name_sid_hash(names) ⇒ Object



337
338
339
340
341
342
343
344
345
346
347
# File 'lib/puppet/util/windows/adsi.rb', line 337

def self.name_sid_hash(names)
  return [] if names.nil? or names.empty?

  sids = names.map do |name|
    sid = Puppet::Util::Windows::SID.name_to_sid_object(name)
    raise Puppet::Error.new( "Could not resolve username: #{name}" ) if !sid
    [sid.to_s, sid]
  end

  Hash[ sids ]
end

.uri(name, host = '.') ⇒ Object



314
315
316
317
318
# File 'lib/puppet/util/windows/adsi.rb', line 314

def self.uri(name, host = '.')
  if sid_uri = Puppet::Util::Windows::ADSI.sid_uri_safe(name) then return sid_uri end

  Puppet::Util::Windows::ADSI.uri(name, 'group', host)
end

Instance Method Details

#add_member_sids(*sids) ⇒ Object



363
364
365
366
367
# File 'lib/puppet/util/windows/adsi.rb', line 363

def add_member_sids(*sids)
  sids.each do |sid|
    native_group.Add(Puppet::Util::Windows::ADSI.sid_uri(sid))
  end
end

#add_members(*names) ⇒ Object Also known as: add_member



349
350
351
352
353
# File 'lib/puppet/util/windows/adsi.rb', line 349

def add_members(*names)
  Puppet.deprecation_warning('Puppet::Util::Windows::ADSI::Group#add_members is deprecated; please use Puppet::Util::Windows::ADSI::Group#add_member_sids')
  sids = self.class.name_sid_hash(names)
  add_member_sids(*sids.values)
end

#commitObject



328
329
330
331
332
333
334
335
# File 'lib/puppet/util/windows/adsi.rb', line 328

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

#member_sidsObject



382
383
384
385
386
387
388
# File 'lib/puppet/util/windows/adsi.rb', line 382

def member_sids
  sids = []
  native_group.Members.each do |m|
    sids << Puppet::Util::Windows::SID.octet_string_to_sid_object(m.objectSID)
  end
  sids
end

#membersObject



375
376
377
378
379
380
# File 'lib/puppet/util/windows/adsi.rb', line 375

def members
  # WIN32OLE objects aren't enumerable, so no map
  members = []
  native_group.Members.each {|m| members << m.Name}
  members
end

#remove_member_sids(*sids) ⇒ Object



369
370
371
372
373
# File 'lib/puppet/util/windows/adsi.rb', line 369

def remove_member_sids(*sids)
  sids.each do |sid|
    native_group.Remove(Puppet::Util::Windows::ADSI.sid_uri(sid))
  end
end

#remove_members(*names) ⇒ Object Also known as: remove_member



356
357
358
359
360
# File 'lib/puppet/util/windows/adsi.rb', line 356

def remove_members(*names)
  Puppet.deprecation_warning('Puppet::Util::Windows::ADSI::Group#remove_members is deprecated; please use Puppet::Util::Windows::ADSI::Group#remove_member_sids')
  sids = self.class.name_sid_hash(names)
  remove_member_sids(*sids.values)
end

#set_members(desired_members) ⇒ Object



390
391
392
393
394
395
396
397
398
399
400
401
402
403
# File 'lib/puppet/util/windows/adsi.rb', line 390

def set_members(desired_members)
  return if desired_members.nil? or desired_members.empty?

  current_hash = Hash[ self.member_sids.map { |sid| [sid.to_s, sid] } ]
  desired_hash = self.class.name_sid_hash(desired_members)

  # First we add all missing members
  members_to_add = (desired_hash.keys - current_hash.keys).map { |sid| desired_hash[sid] }
  add_member_sids(*members_to_add)

  # Then we remove all extra members
  members_to_remove = (current_hash.keys - desired_hash.keys).map { |sid| current_hash[sid] }
  remove_member_sids(*members_to_remove)
end

#uriObject



310
311
312
# File 'lib/puppet/util/windows/adsi.rb', line 310

def uri
  self.class.uri(name)
end