vb.net - UserPrincipal.Save() - vshost32.exe has stopped working - Corrupt heap -
i'm writing software import csv file active directory (to create user accounts). @ point know working importing multiple accounts. i'm not sure i've changed it's been while since last worked on it. imports 2 accounts , crashes on line below during third loop iteration (however third account still created):
newuser.save() when crashes error "vshost32.exe has stopped working". enabled native code debugging , error: "0xc0000374: heap has been corrupted" , invalidcastexception (see immediate window @ end of post full error). testing i've been deleting , recreating same accounts. if don't delete first 3 accounts, principal exists exception handled , program crashes on 4th iteration, , 5th , on. never crashes on first two. (the data i'm importing identical except numbers - e.g. samaccountnames: test1, test2, test3 etc)
my code
private sub bwimport_dowork(sender object, e system.componentmodel.doworkeventargs) handles bwimport.dowork dim _worker backgroundworker = ctype(sender, backgroundworker) dim beginimport new startimport(addressof progressform.startimport) me.invoke(beginimport, new object() {dtusers.rows.count}) dim log new updatelog(addressof progressform.updatelog) '### do: check mandatory columns/attributes in datatable '### do: check duplicate samaccountnames, userprincipalnames , cononical names #if not debug try #end if dim rownum integer = 0 'keep track of how many accounts have been created each row datarow in dtusers.rows dim newuser userprincipalex = new userprincipalex(adctx) newuser.samaccountname = row("samaccountname") newuser.setpassword(row("password")) 'general tab (of template exporter) if row.table.columns.contains("initials") newuser.initials = row("initials") end if if row.table.columns.contains("givenname") newuser.givenname = row("givenname") end if if row.table.columns.contains("sn") newuser.surname = row("sn") end if if row.table.columns.contains("displayname") newuser.displayname = row("displayname") end if if row.table.columns.contains("description") newuser.description = row("description") end if if row.table.columns.contains("physicaldeliveryofficename") newuser.office = row("physicaldeliveryofficename") end if if row.table.columns.contains("telephonenumber") newuser.telephonenumber = row("telephonenumber") end if if row.table.columns.contains("wwwhomepage") newuser.webpage = row("wwwhomepage") end if 'address tab (of template exporter) if row.table.columns.contains("streetaddress") newuser.street = row("streetaddress") end if if row.table.columns.contains("postofficebox") newuser.pobox = row("postofficebox") end if if row.table.columns.contains("l") 'city newuser.city = row("l") end if if row.table.columns.contains("st") 'state/province newuser.state = row("st") end if if row.table.columns.contains("postalcode") newuser.postcode = row("postalcode") end if '### do: add country fields 'account tab (of template exporter) if row.table.columns.contains("userprincipalname") newuser.userprincipalname = row("userprincipalname") end if if row.table.columns.contains("resetpassword") if row("resetpassword").tostring.tolower = "yes" newuser.expirepasswordnow() 'force user change password @ next logon end if end if if row.table.columns.contains("preventpasswordchange") if row("preventpasswordchange").tostring.tolower = "yes" newuser.usercannotchangepassword = true end if end if if row.table.columns.contains("passwordneverexpires") if row("passwordneverexpires").tostring.tolower = "yes" newuser.passwordneverexpires = true end if end if if row.table.columns.contains("accountdisabled") if row("accountdisabled").tostring.tolower = "yes" newuser.enabled = false else newuser.enabled = true end if else 'enable account default if not specified newuser.enabled = true end if if row.table.columns.contains("accountexpires") dim expireydate date date.tryparse(row("accountexpires"), expireydate) 'try convert data row("accountexpires") date newuser.accountexpirationdate = expireydate end if 'profile tab (of template exporter) if row.table.columns.contains("profilepath") newuser.profilepath = row("profilepath") end if if row.table.columns.contains("scriptpath") newuser.scriptpath = row("scriptpath") end if if row.table.columns.contains("homedrive") newuser.homedrive = row("homedrive") end if if row.table.columns.contains("homedirectory") newuser.homedirectory = row("homedirectory") end if 'telephones tab (of template exporter) if row.table.columns.contains("homephone") newuser.homephone = row("homephone") end if if row.table.columns.contains("pager") newuser.pager = row("pager") end if if row.table.columns.contains("mobile") newuser.mobile = row("mobile") end if if row.table.columns.contains("facsimiletelephonenumber") newuser.fax = row("facsimiletelephonenumber") end if if row.table.columns.contains("ipphone") newuser.ipphone = row("ipphone") end if 'organization tab if row.table.columns.contains("title") newuser.title = row("title") end if if row.table.columns.contains("department") newuser.department = row("department") end if if row.table.columns.contains("company") newuser.company = row("company") end if rownum += 1 _worker.reportprogress(rownum) 'update progress dialog try newuser.save() 'save user active directory me.invoke(log, new object() {"successfully created " + row("samaccountname") + " (" + row("displayname") + ")", frmprogress.logtype.success}) catch ex principalexistsexception me.invoke(log, new object() {"error creating " + row("samaccountname") + " (" + row("displayname") + "). " + ex.message, frmprogress.logtype.failure}) continue end try 'member of tab if row.table.columns.contains("memberof") dim groups() string = row("memberof").tostring.split(";") 'add user specified groups dim groupprincipal groupprincipal try 'try adding group(s) each group string in groups groupprincipal = groupprincipal.findbyidentity(adctx, group) 'search group name, sid, samaccountname or display name if groupprincipal isnot nothing groupprincipal.members.add(newuser) 'add user group groupprincipal.save() else me.invoke(log, new object() {"unable add " + row("samaccountname") + " group: " + group + ". group not found.", frmprogress.logtype.failure}) end if next catch ex principalexistsexception '### do: try group name in exception me.invoke(log, new object() {"error adding " + row("samaccountname") + " (" + row("displayname") + ") " + "group(s). " + ex.message, frmprogress.logtype.failure}) end try end if newuser.dispose() 'dispose of newuser object next #if not debug catch ex exception msgbox(ex.message, msgboxstyle.critical) end try #end if end sub immediate window (when native debugging enabled)
critical error detected c0000374 first-chance exception @ 0x76fbf996 in ad user importer.exe: 0xc0000374: heap has been corrupted. first chance exception of type 'system.invalidcastexception' occured in system.directoryservices.accountmanagement.dll
Comments
Post a Comment