Friday, 9 September 2016

FIM/ MIM Integration | ServiceNow MA

This article can be refer as reference only, how can you build your first Management Agent connect to Service Now.  The samples code show how to call the Service Now REST API from ECMA 2.0
The table for users is sys_user in Service Now or get the details of table from service now developer.

Service Now API exchange the information in form of JSON (Java Script Object Notation)

To parse JSON object in C#, use the Newtonsoft JSON library  http://www.newtonsoft.com/json

The Code, please make your own adjustment according to your need, 

using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Collections.Specialized;
using Microsoft.MetadirectoryServices;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Net;
namespace FimSync_Ezma
{
public class EzmaExtension :
//IMAExtensible2CallExport,
IMAExtensible2CallImport,
//IMAExtensible2FileImport,
//IMAExtensible2FileExport,
//IMAExtensible2GetHierarchy,
IMAExtensible2GetSchema,
IMAExtensible2GetCapabilities,
IMAExtensible2GetParameters
//IMAExtensible2GetPartitions
{
private int m_importDefaultPageSize = 1200;
private int m_importMaxPageSize = 1500;
public string Password;
public string Username;
public string path;
//
// Constructor
//
public EzmaExtension()
{
//
// TODO: Add constructor logic here
//
}
public MACapabilities Capabilities
{
get
{
MACapabilities myCapabilities = new MACapabilities();
myCapabilities.ConcurrentOperation = true;
myCapabilities.ObjectRename = false;
myCapabilities.DeleteAddAsReplace = true;
myCapabilities.DeltaImport = true;
myCapabilities.DistinguishedNameStyle = MADistinguishedNameStyle.None;
myCapabilities.ExportType = MAExportType.AttributeUpdate;
myCapabilities.NoReferenceValuesInFirstExport = false;
myCapabilities.Normalizations = MANormalizations.None;
return myCapabilities;
}
}
public int ImportDefaultPageSize
{
get
{
return m_importDefaultPageSize;
}
}
public int ImportMaxPageSize
{
get
{
return m_importMaxPageSize;
}
}
public CloseImportConnectionResults CloseImportConnection(CloseImportConnectionRunStep importRunStep)
{
return new CloseImportConnectionResults();
}
public IList<ConfigParameterDefinition> GetConfigParameters(KeyedCollection<string, ConfigParameter> configParameters, ConfigParameterPage page)
{
List<ConfigParameterDefinition> configParametersDefinitions = new List<ConfigParameterDefinition>();
switch (page)
{
case ConfigParameterPage.Connectivity:
configParametersDefinitions.Add(ConfigParameterDefinition.CreateStringParameter("path", ""));
configParametersDefinitions.Add(ConfigParameterDefinition.CreateStringParameter("Username", ""));
configParametersDefinitions.Add(ConfigParameterDefinition.CreateStringParameter("Password", ""));
break;
//case ConfigParameterPage.Global:
// break;
//case ConfigParameterPage.Partition:
// break;
//case ConfigParameterPage.RunStep:
// break;
}
return configParametersDefinitions;
}
public GetImportEntriesResults GetImportEntries(GetImportEntriesRunStep importRunStep)
{
List<CSEntryChange> csentries = new List<CSEntryChange>();
GetImportEntriesResults importReturnInfo;
WebClient c = new WebClient();
c.UseDefaultCredentials = true;
c.Credentials = new NetworkCredential(this.Username, this.Password);
var data = c.DownloadString(this.path);
var jObject = Newtonsoft.Json.Linq.JObject.Parse(data);
var listResult = jObject["result"];
string name1 = "", email1 = "";
foreach (var result in listResult)
{
name1 = result["name"].ToString();
email1 = result["email"].ToString();
CSEntryChange csentry1 = CSEntryChange.Create();
csentry1.ObjectModificationType = ObjectModificationType.Add;
csentry1.ObjectType = "Person";
csentry1.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("name", name1));
csentry1.AttributeChanges.Add(AttributeChange.CreateAttributeAdd("email", email1));
csentries.Add(csentry1);
}
importReturnInfo = new GetImportEntriesResults();
importReturnInfo.MoreToImport = false;
importReturnInfo.CSEntries = csentries;
return importReturnInfo;
}
public Schema GetSchema(KeyedCollection<string, ConfigParameter> configParameters)
{
Microsoft.MetadirectoryServices.SchemaType personType = Microsoft.MetadirectoryServices.SchemaType.Create("Person", false);
//myname = configParameters["myname"].Value;
string myattribute = "name";
string myattributes = "email";
if (myattribute == "name")
{
personType.Attributes.Add(SchemaAttribute.CreateAnchorAttribute(myattribute, AttributeType.String));
}
if (myattributes == "email")
{
personType.Attributes.Add(SchemaAttribute.CreateAnchorAttribute(myattributes, AttributeType.String));
}
Schema schema = Schema.Create();
schema.Types.Add(personType);
return schema;
}
public OpenImportConnectionResults OpenImportConnection(KeyedCollection<string, ConfigParameter> configParameters, Schema types, OpenImportConnectionRunStep importRunStep)
{
this.path = configParameters["path"].Value;
this.Username = configParameters["Username"].Value;
this.Password = configParameters["Password"].Value;
return new OpenImportConnectionResults();
}
public ParameterValidationResult ValidateConfigParameters(KeyedCollection<string, ConfigParameter> configParameters, ConfigParameterPage page)
{
ParameterValidationResult myResults = new ParameterValidationResult();
return myResults;
}
};
}
view raw ServiceNow.cs hosted with ❤ by GitHub


The password is not encrypted.




Configure Run Profile "Full Import" and run it.
In connector it will import all the users from service now table.




Thanks.. Best of LUCK.

.


ServiceNow onboarding Sailpoint