Class: Chef::Util::Windows::NetUser

Inherits:
Chef::Util::Windows show all
Defined in:
lib/chef/util/windows/net_user.rb

Overview

wrapper around a subset of the NetUser* APIs. nothing Chef specific, but not complete enough to be its own gem, so util for now.

Constant Summary collapse

LOGON32_PROVIDER_DEFAULT =
0
LOGON32_LOGON_NETWORK =
3

Instance Method Summary collapse

Constructor Details

#initialize(username) ⇒ NetUser

Returns a new instance of NetUser.



112
113
114
115
# File 'lib/chef/util/windows/net_user.rb', line 112

def initialize(username)
  @username = username
  @name = multi_to_wide(username)
end

Instance Method Details

#add(args) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/chef/util/windows/net_user.rb', line 146

def add(args)
  user = (args)
  buffer = (user)

  rc = NetUserAdd.call(nil, 3, buffer, rc)
  if rc != NERR_Success
    raise ArgumentError, get_last_error(rc)
  end

  #usri3_primary_group_id:
  #"When you call the NetUserAdd function, this member must be DOMAIN_GROUP_RID_USERS"
  NetLocalGroupAddMembers(nil, multi_to_wide("Users"), 3, buffer[0,PTR_SIZE], 1)
end

#check_enabledObject



195
196
197
# File 'lib/chef/util/windows/net_user.rb', line 195

def check_enabled
  (get_info()[:flags] & UF_ACCOUNTDISABLE) != 0
end

#deleteObject



176
177
178
179
180
181
# File 'lib/chef/util/windows/net_user.rb', line 176

def delete
  rc = NetUserDel.call(nil, @name)
  if rc != NERR_Success
    raise ArgumentError, get_last_error(rc)
  end
end

#disable_accountObject



183
184
185
186
187
# File 'lib/chef/util/windows/net_user.rb', line 183

def 
  user_modify do |user|
    user[:flags] |= UF_ACCOUNTDISABLE
  end
end

#enable_accountObject



189
190
191
192
193
# File 'lib/chef/util/windows/net_user.rb', line 189

def 
  user_modify do |user|
    user[:flags] &= ~UF_ACCOUNTDISABLE
  end
end

#get_infoObject



131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/chef/util/windows/net_user.rb', line 131

def get_info
  ptr  = 0.chr * PTR_SIZE
  rc = NetUserGetInfo.call(nil, @name, 3, ptr)

  if rc != NERR_Success
    raise ArgumentError, get_last_error(rc)
  end

  ptr = ptr.unpack('L')[0]
  buffer = 0.chr * SIZEOF_USER_INFO_3
  memcpy(buffer, ptr, buffer.size)
  NetApiBufferFree(ptr)
  (buffer)
end

#update(args) ⇒ Object



168
169
170
171
172
173
174
# File 'lib/chef/util/windows/net_user.rb', line 168

def update(args)
  user_modify do |user|
    args.each do |key,val|
      user[key] = val
    end
  end
end

#user_modify(&proc) ⇒ Object



160
161
162
163
164
165
166
# File 'lib/chef/util/windows/net_user.rb', line 160

def user_modify(&proc)
  user = get_info
  user[:last_logon] = user[:units_per_week] = 0 #ignored as per USER_INFO_3 doc
  user[:logon_hours] = nil #PBYTE field; \0 == no changes
  proc.call(user)
  set_info(user)
end

#validate_credentials(passwd) ⇒ Object

XXX for an extra painful alternative, see: support.microsoft.com/kb/180548



120
121
122
123
124
125
126
127
128
129
# File 'lib/chef/util/windows/net_user.rb', line 120

def validate_credentials(passwd)
  token = 0.chr * PTR_SIZE
  res = LogonUser.call(@username, nil, passwd,
                       LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, token)
  if res == 0
    return false
  end
  ::Windows::Handle::CloseHandle.call(token.unpack('L')[0])
  return true
end