Class: Chef::Util::Windows::NetUser
- Inherits:
-
Chef::Util::Windows
- Object
- Chef::Util::Windows
- Chef::Util::Windows::NetUser
- 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
- #add(args) ⇒ Object
- #check_enabled ⇒ Object
- #delete ⇒ Object
- #disable_account ⇒ Object
- #enable_account ⇒ Object
- #get_info ⇒ Object
-
#initialize(username) ⇒ NetUser
constructor
A new instance of NetUser.
- #update(args) ⇒ Object
- #user_modify(&proc) ⇒ Object
-
#validate_credentials(passwd) ⇒ Object
XXX for an extra painful alternative, see: support.microsoft.com/kb/180548.
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 = user_info_3(args) buffer = user_info_3_pack(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_enabled ⇒ Object
195 196 197 |
# File 'lib/chef/util/windows/net_user.rb', line 195 def check_enabled (get_info()[:flags] & UF_ACCOUNTDISABLE) != 0 end |
#delete ⇒ Object
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_account ⇒ Object
183 184 185 186 187 |
# File 'lib/chef/util/windows/net_user.rb', line 183 def disable_account user_modify do |user| user[:flags] |= UF_ACCOUNTDISABLE end end |
#enable_account ⇒ Object
189 190 191 192 193 |
# File 'lib/chef/util/windows/net_user.rb', line 189 def enable_account user_modify do |user| user[:flags] &= ~UF_ACCOUNTDISABLE end end |
#get_info ⇒ Object
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) user_info_3_unpack(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 |