public static void GetData() { try { // get a domain context DirectoryContext context = new DirectoryContext( DirectoryContextType.Domain); // alternative for testing a specific server's replication status. // this uses the GetDomainController context remarked below. // DirectoryContext context = new DirectoryContext( // DirectoryContextType.DirectoryServer, // "sea-dc-02.fabrikam.com"); // bind to a domain controller in the domain. The context for this FindOne // method must be domain DomainController dc = DomainController.FindOne(context); // alternative for getting a DC to check its replication status. // DomainController dc = DomainController.GetDomainController(context); // retrieve replication cursor information for each replicated partition Console.WriteLine("\nReplication cursor data for each partition\n"); foreach (string partition in dc.Partitions) { Console.WriteLine("\tPartition {0}", partition); foreach (ReplicationCursor cursor in dc.GetReplicationCursors(partition)) { Console.WriteLine("\t\tSourceServer: {0}\n" + "\t\tLastSuccessfulSyncTime: {1}\n" + "\t\tSourceInvocationId: {2}\n" + "\t\t octet string format: {3}\n" + "\t\tusn: {4}\n", cursor.SourceServer, cursor.LastSuccessfulSyncTime, cursor.SourceInvocationId, BuildFilterOctetString(cursor.SourceInvocationId.ToByteArray()), cursor.UpToDatenessUsn ); } } // retrieve replication neighbor information Console.WriteLine("\nReplication neighbor data\n"); foreach (string partition in dc.Partitions) { Console.WriteLine("\tPartition: {0}", partition); foreach (ReplicationNeighbor neighbor in dc.GetReplicationNeighbors(partition)) { Console.WriteLine("\t\tSourceServer: {0}\n" + "\t\tReplicationNeighborFlag: {1}\n" + "\t\tUsnAttributeFilter: {2}\n" + "\t\tLastSuccessfulSync: {3}\n", neighbor.SourceServer, neighbor.ReplicationNeighborOption, neighbor.UsnAttributeFilter, neighbor.LastSuccessfulSync); } } // retrieve the inbound replication connections // other servers initiate replication to this server Console.WriteLine("\nInbound replication connection data\n"); foreach (ReplicationConnection con in dc.InboundConnections) { Console.WriteLine("\tReplication connection name (cn): {0}\n " + "\tSourceServer: {1}\n " + "\tDestinationServer: {2}\n" + "\tTransport type: {3}\n" + "\tConnection schedule owned by user: {4}\n", con.Name, con.SourceServer, con.DestinationServer, con.TransportType, con.ReplicationScheduleOwnedByUser ); } // retrieve the outbound replication connections // this server initiates replication to the following servers Console.WriteLine("\nOutbound replication connection data\n"); foreach (ReplicationConnection con in dc.OutboundConnections) { Console.WriteLine("\tReplication connection (cn): {0}\n" + "\tSourceServer: {1}\n" + "\tDestinationServer: {2}\n" + "\tTransport type: {3}\n", con.Name, con.SourceServer, con.DestinationServer, con.TransportType ); } // A simple approach using S.DS to get to the dn of the current domain DirectoryEntry de = new DirectoryEntry(); string targetDomainDN = de.Properties["distinguishedName"].Value.ToString(); // UPDATE THIS VALUE WITH A VALID RDN OF AN OBJECT IN YOUR DOMAIN. // If you want to evaluate the replication status of a child object // of an object that is a child of // the domain, then include it's path up to the domain level: // e.g., "cn=user1,ou=techwriters" string AdObjectRdn = "ou=techwriters"; string objectPath = AdObjectRdn + "," + targetDomainDN; // retrieve the replication metadata information for a specific object Console.WriteLine("\nReplication metadata data for object path {0}\n", objectPath); ActiveDirectoryReplicationMetadata metadata = null; try { metadata = dc.GetReplicationMetadata(objectPath); } catch (ArgumentException e) { Console.WriteLine("{0}.\nPlease specify an existing " + "object for the ADObjectRdn variable", e.Message); return; } // iterate through the attributes associated with this object foreach (string attribute in metadata.AttributeNames) { Console.WriteLine("\tAttribute lDAPDisplayName: {0}\n", attribute); // for each attribute, assign an AttributeMetadata object by // passing the ActiveDirectoryReplicationMetadata object the // lDapDisplayName of the attribute to inspect. The // ActiveDirectoryReplicationMetadata object gets the attribute // to inspect. AttributeMetadata replicationData = metadata[attribute]; Console.WriteLine("\t\tOriginatingServer: {0}\n" + "\t\tOriginatingChangeUsn: {1}\n" + "\t\tLocalChangeUsn: {2}\n" + "\t\tLastOriginatingChangeTime: {3}\n", replicationData.OriginatingServer, replicationData.OriginatingChangeUsn, replicationData.LocalChangeUsn, replicationData.LastOriginatingChangeTime); } } catch (Exception e) { Console.WriteLine("\r\nUnexpected exception occured:\n{0}:{1}", e.GetType().Name, e.Message); } }
static void Main() { try { string targetDomainName = "fabrikam.com"; string objectPath = "cn=users,dc=fabrikam,dc=com"; // get to the domain controller DomainController dc = DomainController.FindOne( new DirectoryContext( DirectoryContextType.Domain, targetDomainName)); // to provide alternate credentials, use the below // DomainController dc = DomainController.FindOne( // new DirectoryContext( // DirectoryContextType.Domain, // targetDomainName, // "alt-username", // "alt-password")); // retrieve replication cursor information Console.WriteLine("\nGet replication cursor information" + " for each partition"); foreach (string s in dc.Partitions) { Console.WriteLine("\nPartition {0}", s); foreach (ReplicationCursor cursor in dc.GetReplicationCursors(s)) { Console.WriteLine("\tSourceServer is {0}, " + "SourceInvocationId is {1}, " + "LastSuccessfulSyncTime is {2}", cursor.SourceServer, cursor.SourceInvocationId, cursor.LastSuccessfulSyncTime); } } // retrieve replication neighbor information Console.WriteLine("\n\nGet replication neighbor information"); foreach (string s in dc.Partitions) { Console.WriteLine("\nPartition {0}", s); foreach (ReplicationNeighbor neighbor in dc.GetReplicationNeighbors(s)) { Console.WriteLine("\tSourceServer is {0}, " + "ReplicationNeighborFlag is {1}, " + "UsnAttributeFilter is {2}, " + "LastSuccessfulSync is {3}", neighbor.SourceServer, neighbor.ReplicationNeighborOption, neighbor.UsnAttributeFilter, neighbor.LastSuccessfulSync); } } // retrieve the replication metadata information Console.WriteLine("\n\nGet replication metadata information"); ActiveDirectoryReplicationMetadata metadata = dc.GetReplicationMetadata(objectPath); foreach (object o in metadata.AttributeNames) { Console.WriteLine("\nAttribute {0}", o); AttributeMetadata attr = metadata[(string)o]; Console.WriteLine("\tOriginatingServer is {0}, " + "OriginatingChangeUsn is {1}, " + "LocalChangeUsn is {2}, " + "LastOriginatingChangeTime is {3}", attr.OriginatingServer, attr.OriginatingChangeUsn, attr.LocalChangeUsn, attr.LastOriginatingChangeTime); } // retrieve the inbound replication connections Console.WriteLine("\n\nGet inbound replication " + "connection information"); foreach (ReplicationConnection con in dc.InboundConnections) { Console.WriteLine("\tReplication connection \"{0}\", " + "SourceServer is {1}, " + "DestinationServer is {2}", con.Name, con.SourceServer, con.DestinationServer); } // retrieve the outbound replication connections Console.WriteLine("\n\nGet outbound replication " + "connection information"); foreach (ReplicationConnection con in dc.OutboundConnections) { Console.WriteLine("\tReplication connection \"{0}\", " + "SourceServer is {1}, " + "DestinationServer is {2}", con.Name, con.SourceServer, con.DestinationServer); } } catch (Exception e) { Console.WriteLine("\r\nUnexpected exception occured:\r\n\t" + e.GetType().Name + ":" + e.Message); } }