"One of the top Identity Management Strategists in the market today!"

Welcome to my Identity Management blog with focus on proven implementation stratigies, best practices, product selection, and where I open my expertse to You!

Fortune 100, Higher Education, Government... I've done it all. I'm 7 feet tall, live in NYC, tattooed, and love a challenge! Here's what I've learned...

Adam Callen

Archive for 'OIM'

OIM Table Structure from 9.0.1.1

Rajnish Bhatia has provided the community with an AWESOME resource. He’s listed out all the tables of OIM and what they correlate to. I have personally referenced this table a ton of times, and I know others have as well. I’m mirroring it here for data integrity.

Please go to his website (http://rajnishbhatia19.blogspot.com/2008/08/oim-tables-descriptions-9011.html) and check out his other articles.

Great stuff!

.: Adam

 

From Rajnish:

The following table lists the purpose of each table within OIM.

Note: Custom Tables are created for user defined Object / Process Forms.

TABLE NAME IN OIM DESCRIPTION OF TABLE
AAD List To Define The Administrators For Each Organization And Their Delegated Admin Privileges
AAP Table for storing Resource – Organization level parameter Values
ACP ACP – Link Table That Holds Reference To ACT And PKG Tables, Table That Defines The Objects (Resources) Allowed For A Particular Organization
ACS Link Table for Account Table(ACT) and Server Table(SVR)
ACT Defines information about all organizations created through Xellerate
ADJ Contains the Java API information for the constructor with parameters and method name with parameters chosen for an adapter task of type JAVA, UTILITY, TAME,REMOTE, or XLAPI.
ADL Contains the all of the necessary parameters for an adapter task of type IF, ELSE IF,FOR, WHILE, SET, and VARIABLE tasks. These type of tasks are known as LOGICTASKS
ADM Data mapping between parameters input/output parameters and source/sink
ADP Defines an adapter created through the Adapter Factory
ADS Database,schema and procedure name selections which define a stored procedure adaptertask
ADT Defines a task attached to an adapter
ADU Contains the web service and method chosen for a task of the Adapter Factory
ADV Adapter variable table contains variables that have been created for specific adapters.
AFM Links an adapter with a form
AGS Holds the definition of organization/contact groups
AOA Contains the OpenAdapter property file for OpenAdapter
APA To store attestation process administrators
APD To store attestation Process definition
APT To store the attestation tasks
ARS Contains custom response codes for ‘Process Task’ Adapters only
ATD To store entitlement details for each attestation task
ATP Defines input and output parameters for the constructor and method of an adapter taskof type JAVA, UTILITY, TAME, REMOTE, and XLAPI
ATR To store attestation requests
ATS Stores which services or can be ordered by which organizations and which rates apply
AUD Define the Auditors
AUD_JMS
CRT Trusted Certificate Information
DAV Stores the runtime data mappings for ‘Entity’ & ‘Rule Generator’ adapters. The data source being an Xellerate form or child table,or a user defined process form.
DEP Dependencies among Tasks Within A Workflow Process
DOB Data Resource definition consisting of the fully qualified class name of the dataobject
DVT Defines the one to many relationship between Data Resources and Event Handlers (this includes adapters)
EIF Export Import Files. Each row contains one single file used in export/import operation. For export there is only one file
EIH Export Import History. Each row represents one Data Deployment Management session.
EIL DB Based lock for export operation. Used to make sure only one user can import at atime. This is currently not managed through data objects
EIO Export Import Objects. Each row represents one object exported/imported
EIS Substitutions used during import process
EMD Core –Email Definition Information Table That Holds The Email Template Definitions
ERR Error codes
ESD Encrypted columns not within the bounds of the SDK
EVT Defines event handlers by providing a process and class name. In addition the scheduling time of when the event handler can execute is set to pre (insert, update, delete) or post (insert, update, delete)
FUG List to define the administrators for each user defined object in the ‘StructureUtility’ form or for each user defined field in the ‘User Defined FieldDefinition’ form
GPG List to define the (nested) group members of User Group in the ‘User Group’ form.
GPP List to define the Administrators and their delegated admin rights over a User Group
GPY Joins Properties (PTY) and Groups (UGP).
IEI Table where all the imports and exports are defined
LAY Table where the layouts are defined for the various imports and exports
LIT Import/export table.
LKU Lookup definition entries
LKV Lookup values
LOB Import/export table.
LOC Holds information about locations
MAP XML MapSchema Information
MAV Stores the runtime data mappings for ‘Process Task’ adapters. The data source being a process form, Location, User, Organization, Process, IT Resource, orLiteral data.
MEV E-mail notification events
MIL Holds information about tasks of a process
MSG Defines the user groups that have permission to set the status of a process task.
MST Task Status And Object Status Information. Holds All The Task Status To Object Status Mappings
OBA Object Authorizer Information
OBD Object Dependencies
OBI Object Instance Information
OBJ Resource Object definition information.
ODF Holds Object To Process Form Data Flow Mappings.
ODV Object Events/Adapters Information
OIO Object Instance Request Target Organization Information.
OIU Object Instance Request Target User Information.
OOD Object Instance Request Target Organization Dependency Information.
ORC This Entity Holds The Detail On Each Order. This Could Be Considered The Items Section Of An Invoice. This Entity Is The Instance Of A Particular Process
ORD Holds information that is necessary to complete an order regardless of a processbeing ordered
ORF Resource Reconciliation Fields
ORR Object Reconciliation Action Rules
OSH Task Instance Assignment History
OSI Holds information about tasks that are created for an order
OST Object Status Information
OUD Object Instance Request Target User Dependency Information. Holds The Dependency Between Different Resource Instances Provisioned To A User.
OUG List to define the administrators for each Resource
PCQ Holds the challenging questions and answers for a user
PDF Package data flow table holds the data flow relationships between packages
PHO Holds all communication addresses for this contact — e.g., contact telephone numbers,fax numbers, e-mail, etc.
PKD Package dependency table holds the dependency relationships between child packages of a parent package
PKG Consists of names and system keys of service processes, which consist of a group ofservices from the TOS table. Defines a Process in Xellerate.
PKH Package Hierarchy Table Holds The Parent-child Relationships Between Processes
POC Stores values for the child tables of the Object/Process form of a resource being provisioned by an access policy
POF Policy field table holds the field value pairs that constitute the definition of apolicy
POG Join table between Policy and User Groups, Specifies the groups to whom an access policy will apply.
POL Policy Table Holds A Policy, Defines An Access Policy In The System
POP Policy Package Join Table Holds The Packages That A Particular Policy Orders For User, Defines Which Resources Will Be Provisioned Or Denied For A Particular Access Policy.
PRF Process Reconciliation Field Mappings
PRO Defines a process name, scheduling frequency, and priority. A process is made up of oneor more tasks
PTY Client Properties Table
PUG List to define The Administrators And Their Delegated Admin Rights For Each Process.
PWR Table forPassword Rule Policies
PXD Table that holds the list of all Proxies Defined
QUE Administrative queues definition
QUM Administrative queue members
RAV Stores the runtime data mappings for ‘Pre-populate’ adapters. The data source being an Xellerate form or child table, or a user defined form
RCA Reconciliation Event Organizations Matched
RCB Reconciliation Event Invalid Data
RCD Reconciliation Event Data
RCE Reconciliation Events
RCH Reconciliation Event Action History
RCM Reconciliation Event Multi-Valued Attribute Data
RCP Reconciliation Event Processes Matched
RCU Reconciliation Event Users Matched
REP Table that contains all information about reports in the system
REQ This table holds request information
RES This table is used to stored adapter resources entered by the user.
RGM Table for Response Code Generated Milestones
RGP Rules To Apply To A User Group, Defines The Auto-group Membership Rules Attached To AParticular Group.
RGS Defines all known registries. These are used by Web Service tasks in an Adapter to communicate with a web service
RIO Request Organizations Resolved Object Instances
RIU Request Users Resolved Object Instances
RLO This table contains directory URLs which are referenced by Adapter Factoryjar/class files.
RML Rules To Apply To Task, Defines The Task Assignment Rules Attached To A Process Task.
ROP Rules To Apply To An Object-process Pair, Defines The Process Determination Rules Attached To A Resource Object.
RPC Reconciliation Event Process Child Table Matches
RPG Link table between Group table and Report Table. Specifies which group has accessto which reports
RPP Parameters passed to report.
RPT Stores information related to the creation of reports
RPW Rules To Apply To A Password Policy, Defines The Policy Determination Rules Attached To A Password Policy.
RQA Request target organization information.
RQC Request comment information
RQD Contains self-registration request data for web admin.
RQE Request administrative queues
RQH Requeststatus history
RQO Request object information.
RQU Request object target user information
RQY Request Organizations Requiring Resolution
RQZ Request Users Requiring Resolution
RRE Reconciliation User Matching Rule Elements
RRL Reconciliation User Matching Rules
RRT Reconciliation User Matching Rule Element Properties
RSC Defines the All The Possible Response Code For A Process Task.
RUE Defines the Elements In A Rule Definition.
RUG List to define the administrators for each Request
RUL Rule definitions
RVM Holds Recovery Milestones
SCH Holds specific information about an instance of a ask such as its status orscheduled dates
SDC Column metadata.
SDH Meta-Table Hierarchy.
SDK User define data object meta data definition
SDL SDK version labels
SDP User defined column properties
SEL Data Object Permissions For Groups On A Specified Data object
SIT The SIT table contains information about sites. Sites are subsets of locations.
SPD IT Resource parameter definition
SRE Defines Which Pre-populate Rule Generator Will Run For A Field Of User Defined DataObject.
SRP Should be replaced by the rate table from a billing system. Here it holdspecific rates for specific services.
SRS IT Resource – IT Resource join
STA Status Codes
SUG
SVD IT Resource type definition
SVP IT Resource property definition
SVR IT Resource instance definition
SVS IT Resource – Site Join
TAP Holds parameter values for a task, which is an instantiation of Valid Task,i.e. value for parameter Company Name, etc.
TAS Holds instances of Valid Task. Examples of Valid Tasks would be reports, imports, etc. Valid TaskParameters indicate what parameters can be assassigned to an instance of a task, i.e
TDV Used by event manager/data objects, joins data objects, types of service, and events
TLG Keeps logof SQL transactions.
TMP Indicates which tasks are in a process. Tasks are defined in table; this way, one task can be in many processes.
TOD To do list settings table.
TOS Holds information about a process
TSA Stores initialization params (name/value pairs) forscheduler tasks
TSK Scheduler task definition information
UDP User-defined field table
UGP Defines a group of users
UHD User Policy Profile History Details table
ULN This table hold UHD allow / deny list
UNM “UnDoMilestone” Feature
UPA
UPA_FIELDS Stores changes only for user profile audit history in de-normalized format
UPA_GRP_MEMBERSHIP Stores groups membership history in de-normalized format
UPA_RESOURCE Stores user profile resource history in de-normalized format
UPA_USR Stores user profile history in de-normalized format
UPD User Policy Profile Details table
UPH User Policy Profile History table
UPL User-defined field table
UPP User Policy Profile table
UPT User-defined field table
UPY Joins Properties (PTY) and User (USR) tables.
USG This table stores which users are in which groups.
USR Stores all information regarding a user.
UWP Window sequence, nesting in CarrierBase explorer for each user group.
VTK Defines automation task types such as reports, imports, and exports.
VTP Valid Task Parameters. Indicates which parameters can be defined for an instance of a task.
WIN Windows table: Windows keys, descriptions, and class names.
XSD This table holds Xellerate System Data
  1. Installing Oracle Enterprise Linux 5 Update 3 on VMWare
  2. Installing and Configuring Oracle Database 11g Revision 2 (11gR2)
  3. Installing WebLogic Server 11gR1 (10.3.3)
  4. Executing and Configuring the Repository Creation Utility 11g
  5. Installing, Patching, and Configuring Oracle Identity Management 11g
  6. Installing and Patching the SOA Suite 11g
  7. Installing Oracle Identity and Access Manager 11g
  8. Configuration of Oracle Identity Manager 11g
  9. WebLogic Server and Domain Start-up Options
  10. Starting Oracle Database and Directories

Part 8 – Configuration of Oracle Identity Manager 11g

This video tutorial will walk you though the configuration of Oracle Identity and Access Manager 11g. These tools include:

  • Oracle Access Manager 11g
  • Oracle Adaptive Access Manager 11g
  • Oracle Identity Navigator 11g
  • Oracle Identity Manager 11g
  • Platform Security Services
  • Authorization Policy Manager

 

 

Next >> Part 9 – WebLogic Server and Domain Start-up Options

The original source videos are available for download via Vimeo.com You’ll have to sign in to download them though. To get there, click on the “Vimeo” logo in the video.

If you have any questions, please post them below. I’m pretty tied up at the moment, but others will be able to help too!

Thanks!

.: Adam

  1. Installing Oracle Enterprise Linux 5 Update 3 on VMWare
  2. Installing and Configuring Oracle Database 11g Revision 2 (11gR2)
  3. Installing WebLogic Server 11gR1 (10.3.3)
  4. Executing and Configuring the Repository Creation Utility 11g
  5. Installing, Patching, and Configuring Oracle Identity Management 11g
  6. Installing and Patching the SOA Suite 11g
  7. Installing Oracle Identity and Access Manager 11g
  8. Configuration of Oracle Identity Manager 11g
  9. WebLogic Server and Domain Start-up Options
  10. Starting Oracle Database and Directories

Part 7 – Installing Oracle Identity and Access Manager 11g

This video tutorial will walk you though the installation of Oracle Identity and Access Manager 11g. These tools include:

  • Oracle Access Manager 11g
  • Oracle Adaptive Access Manager 11g
  • Oracle Identity Navigator 11g
  • Oracle Identity Manager 11g
  • Platform Security Services
  • Authorization Policy Manager

You will need to download the 1.7GB Oracle Identity and Access Management (11.1.1.3.0) Generic Installer (ofm_iam_generic_11.1.1.3.0_disk1_1of1.zip).

Download Oracle Identity and Access Management

 

 

Next >> Part 8 – Configuration of Oracle Identity Manager 11g

The original source videos are available for download via Vimeo.com You’ll have to sign in to download them though. To get there, click on the “Vimeo” logo in the video.

If you have any questions, please post them below. I’m pretty tied up at the moment, but others will be able to help too!

Thanks!

.: Adam

Ok… after a ton of debating and drinking, I’ve finally come to a conclusion.

On what, you ask?

Well, over the past few weeks, I’ve been giving myself a crash-course on the new 11g stack for Oracle’s Identity Management Fusion Middleware. During this time, I finally figured out how to get everything installed (on Oracle Enterprise Linux 5 Update 3):

  • Oracle Identity Manger 11g
  • Oracle Access Manager 11g
  • Oracle Adaptive Access Manager 11g
  • Oracle Identity Federation 11g
  • Oracle Internet Directory 11g
  • Oracle Virtual Directory 11g
  • Oracle HTTP Server
  • Oracle Directory Integration Platform 11g
  • Oracle WebLogic Server 11g
  • Oracle Database 11gR2
  • Oracle Identity Navigator 11g
  • Oracle Authorization Policy Manager
  • Oracle Platform Security Services

While doing this, I learned a lot…. srsly…

More importantly, I captured the whole process on video, and made video tutorials / guides on how to install and configure each product. Since it’s a video, you’ll also see a few mistakes that I made along the way, this way if the same happens in the future, the fixes are documented.

There are some documents out there, a few blogs with some high-level steps, and one guy I know is selling an eBook on the install process for about $100 (and it’s probably worth it!), so now my dilemma is two fold:

1. Should I make this information that’s worth more than gold available to others?

2. If so, how much should I charge?

Now back to the “I’ve made a decision” part:

1. Yes, I’m going to release these videos to the public.

2. I’m going to charge $1,000.

 

 

Hahahah… just kidding =)

I’ll be giving them away free, right here!

Once I get the write-up’s done, and the videos uploaded, I’ll starting posting the videos on my blog for everyone to use.

DONE!

  1. Installing Oracle Enterprise Linux 5 Update 3 on VMWare
  2. Installing and Configuring Oracle Database 11g Revision 2 (11gR2)
  3. Installing WebLogic Server 11gR1 (10.3.3)
  4. Executing and Configuring the Repository Creation Utility 11g
  5. Installing, Patching, and Configuring Oracle Identity Management 11g
  6. Installing and Patching the SOA Suite 11g
  7. Installing Oracle Identity and Access Manager 11g
  8. Configuration of Oracle Identity Manager 11g
  9. WebLogic Server and Domain Start-up Options
  10. Starting Oracle Database and Directories

Cheers!

.: Adam

It’s like trying to find a damn leprechaun…

 

Here’s the details on how to patch it: http://download.oracle.com/docs/html/E18749_01/download_readme.htm#BABFICJA

 

Here’s the link to download the Oracle Identity and Access Management 11.1.1.4 patch set: https://updates.oracle.com/download/11060972.html

 

And here’s how to download the Identity Management 11.1.1.4 patch set:

1. Go to Oracle’s eDelivery site: https://edelivery.oracle.com/

2. Select Product Pack: Oracle Fusion Middleware and your platform

3. Select Oracle Fusion Middleware 11g Media Pack

4. Scroll down and download the item: Oracle Identity Management 11g Patch Set 3 (11.1.1.4.0)

 

Sheesh, that’s a pain in the ass.

 

.: Adam

Because Oracle likes to make finding anything useful on their site damn near impossible, I’ve put together OracleIdentityManger.com with all the direct links that we need. You know, things like documentation, downloads, certification matrixes.

I just finished updating the pages with all the 11g info and I fixed a lot of the broken links to the 10g stuff as well (because oracle also doesn’t like to leave stuff in one place… ,making bookmarking impossible). So if you haven’t already, bookmark OracleIdentityManager.com =)

http://www.OracleIdentityManager.com

Next up: OracleAccessManager.com ;)

Cheers!

.: Adam

Where the hell….

So you want to upgrade your OIM environment, but you’ve come across your first roadblock: Where the hell do I get the patches?

If you try Google, you’ll get nada. You try Metalink, and you’re in a world of hurt. I’m pretty sure Oracle obfuscates their information on purpose. I’m not sure of the monetary gain on their part for this yet, but there has to be an angle to making a support system work so horribly.

To the meat!

You can find your upgrade path to all major point numbers and Bundle Patches here:

https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&doctype=FAQ&id=883069.1

It also lists direct links to the downloads.

Later!

.: Adam

How many times have you gone to a clients site, and you ask a fairly simple question:

Me – “What version of OIM do you have installed and what version of connectors?”

Them – “The red one”

Me – *Face palm*

Determining what version of OIM installed is fairly straightforward. Just login to the OIM web console and click the About link at the top. You’ll see the version and the build number. Now if only figuring out which connector version was as easy. Is there a link to click somewhere? Nope. To guarantee that you have the right version number, you need to ssh to the box and go into the …/xellerate/ScheduleTask folder.

In there you’ll see all the Recon jar files for each connector installed. Explode these. Inside, you’ll need to open up the /META-INF/MANIFEST.MF file. Just use any text editor. It will show you all the gory details like this:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.2
Created-By: 1.4.2_12-b03 (Sun Microsystems Inc.)
Version: 9.1.0
Main-Class: com.thortech.xl.um.schedule.hostAccess.testUMBulkRecon
Class-Path: . ../lib/xlAPI.jar ../lib/xlRemoteManager.jar
../lib/xlScheduler.jar
../ThirdParty/csv.jar ../lib/xlLogger.jar
../lib/xlUtils.jar ../ext/log4j
-1.2.8.jar

And in the middle there is your installed version number =)

.: Adam

If you cannot log into the WebSphere Web Console with XELSYSADM and you see the above error in the Dmgr01 SystemOut.log file, here is the solution.

In the OIM transaction database you need to modify the password expire and warn dates to something in the future. Here are the SQL commands used:

update usr set usr_pwd_expire_date=’12-FEB-15′ WHERE USR_LOGIN=’XELSYSADM’;
update usr set usr_pwd_warn_date=’12-FEB-15′ WHERE USR_LOGIN=’XELSYSADM’;

commit the changes and then reset WebSphere (all nodes, and manager). You may have to kill the processes.

Another byproduct of the issue seemed to be hash dumps from the JMS queue causing the hard drive space to fill up. Scan the server for large files (especially log files) and remove them all before starting up WebSphere.

In a previous post, I uncovered how OIM talks with Active directory based on objectGUID values rather than samAccountName, or whatever else you may have setup in the Reconciliation Rules. This posed a problem for me, as I had 40K users with objectGUIDs from Production AD in a test environment. So obviously, none of the accounts were in sync between the two systems. Now, for the fix:

1. Rerun the Active Directory Target Reconciliation

This will resync them all for you. If the objectGUID is not an attribute that is on your recon list, make sure you add it. Also, you may need to clear out the lastReconTimestamp field on the AD IT Resource to make sure that you run the recon against all the users. This is the easiest way. Unfortunately for me, whomever installed this environment did not install / carry over the AD recon scheduled tasks. So this isn’t an option for me… What next?

2. Dump out a CSV of objectGUIDs and samAccountNames from AD, convert the objectGUIDs into a format that OIM recognizes, update the OIM database with the new objectGUIDs.

Lucky for me, I got to figure this one out on my own. =). Here’s how I did it:

First you need to dump out a CSV of all your users in active directory that you want OIM to be syncing up with (in my case, the test AD environment). There’s a tool that comes with AD called “csvde” that will handle this for you quite easily. If you’re using an LDAP browser and looking at a user record, the objectGUID will look something like this:

{FD3B2D30-0428-5348-941B-C405CC0341C2}

When you export the users into a CSV file, the objectGUIDs will look like this:

X’fd3b2d3004285348941bc405cc0341c2′

For my next trick, I needed to convert these into a format that OIM stores them at. If I look at this users objectGUID in the UD_ADUSER table, it will be this:

302d3bfd28044853941bc405cc0341c2

If you want to know how I did this, please read to the bottom. I’m going to skip over that part for now. For everyone else, I’ve made a simple command line utility called ADguid2OIM that will read in the CSV file of 2 colums and output them into a new CSV file with the OIM formatted guids. Woo hoo for you =). You can download ADguid2OIM here. I’m also making the source available (since it’s not the greatest, and you may want to customize it) at the bottom of this post too.

Now that you have the usernames and properly formatted objectGUIDs, you just have to update the OIM database repository with the new values. The table is UD_ADUSER and the field is US_ADUSER_OBJECTGUID. Just make sure that you have a backup of the database in case you mess it all up =).

Now with the correct GUID’s in place, all of your existing OIM users that are supposed to be already provisioned to AD will work correctly for updates! Yay!

I hope this helps someone else out, as I spent a good couple days figuring this all out and hitting my head against a wall a couple times =)

Take care!

.: Adam

For the techies…

Here’s how OIM is storing the AD objectGUIDs in it’s database:

AD objectGUID example: {FD3B2D30-0428-5348-941B-C405CC0341C2}

OIM stored version: 302d3bfd28044853941bc405cc0341c2

The first thing that I noticed is that the last half is the same (the last 2 chunks in the AD version: 941B-C405CC0341C2)

So that left us with just the first half. When you line them up and add the dashes to the OIM one, you may see what I saw:

AD:   FD3B2D30-0428-5348
OIM: 302d3bfd-2804-4853

You’ll notice that the 3 different sets essentially stay the same, but the HEX values are just written in reverse. Take a look at the last set: 5348 and 4853. Split this into the 2 HEX values, 53 and 48, then swap them, and you get 4853. You do the same with the second chunk: 0428=2804 and then with the first set, it’s the same pattern, it’s just that there’s now 4 hex pairs all in reverse: FD 3B 2D 30 = 30 2D 3B FD. String these all together and you get the OIM version of the AD objectGUID: 302d3bfd28044853941bc405cc0341c2. Why Oracle is messing with the value and scrambling it all up? I have no idea.

The little .net command app I wrote is pretty straight forward and could probably be coded better by someone that codes for a living, so I’m putting the source up here in case someone wants to improve on it:

Source Code for ADguid2OIM:

Sub Main()
Dim strOriginal As String = “”
Dim strUsername As String = “”
Dim strNew As String = “”
Dim arrChunks(3) As String
Dim arrPieces(3) As String
Dim strLine As String = “”

Dim oRead As StreamReader
Dim oWrite As StreamWriter

oRead = File.OpenText(“input.txt”)
oWrite = File.CreateText(“output.txt”)

oWrite.AutoFlush = True

strLine = Trim(oRead.ReadLine())

Do While Not strLine Is Nothing And strLine <> “”
Dim arrItems(1) As String

arrItems = Split(strLine, “,”)
strUsername = arrItems(0)
strOriginal = arrItems(1)

‘ Strip out the extranious characters
strOriginal = LCase(Replace(strOriginal, “-”, “”, 1, -1, 1))
strOriginal = Replace(strOriginal, “X’”, “”, 1, -1, 1)
strOriginal = Replace(strOriginal, “‘”, “”, 1, -1, 1)

arrChunks(0) = Left(strOriginal, 8 )
arrChunks(1) = Mid(strOriginal, 9, 4)
arrChunks(2) = Mid(strOriginal, 13, 4)
arrChunks(3) = Right(strOriginal, 16)

arrPieces(0) = Left(arrChunks(0), 2)
arrPieces(1) = Mid(arrChunks(0), 3, 2)
arrPieces(2) = Mid(arrChunks(0), 5, 2)
arrPieces(3) = Right(arrChunks(0), 2)
arrChunks(0) = arrPieces(3) & arrPieces(2) & arrPieces(1) & arrPieces(0)

arrPieces(0) = Left(arrChunks(1), 2)
arrPieces(1) = Right(arrChunks(1), 2)
arrChunks(1) = arrPieces(1) & arrPieces(0)

arrPieces(0) = Left(arrChunks(2), 2)
arrPieces(1) = Right(arrChunks(2), 2)
arrChunks(2) = arrPieces(1) & arrPieces(0)

strNew = arrChunks(0) & arrChunks(1) & arrChunks(2) & arrChunks(3)

oWrite.WriteLine(strUsername & “,” & strNew)

strLine = Trim(oRead.ReadLine())
Loop
oRead.Close()
oWrite.Close()

End Sub