So ändern Sie den System.DirectoryEntry-Attributwert "uSNChanged" in einen Int64-Wert

Ich versuche, den Int64-Wert des "uSNChanged" -Werts eines Directory Services-Objekts abzurufen. Leider wird es immer wieder als COM-Objekt zurückgegeben. Ich habe versucht, Casting für Int64 zu verwenden, Int64.Parse () aufzurufen und Convert.ToInt64 () aufzurufen. Keine dieser Arbeiten.

Für ein bestimmtes DirectoryEntry-Objekt werden in diesem Code die Eigenschaften angezeigt:

    private static void DisplaySelectedProperties(DirectoryEntry objADObject)
    {
        try
        {
            string[] properties = new string[] {
                "displayName",
                "whenCreated",
                "whenChanged",
                "uSNCreated",
                "uSNChanged",
            };

            Console.WriteLine(String.Format("Displaying selected properties of {0}", objADObject.Path));
            foreach (string strAttrName in properties)
            {
                foreach (var objAttrValue in objADObject.Properties[strAttrName])
                {
                    string strAttrValue = objAttrValue.ToString();
                    Console.WriteLine(String.Format("   {0, -22} : {1}", strAttrName, strAttrValue));
                }
            }
            Console.WriteLine();
        }
        catch (Exception ex)
        {
            throw new ApplicationException(string.Format("Fatal error accessing: {0} - {1}", objADObject.Path, ex.Message), ex);
        }
    }

Dies ist die Ausgabe:

Displaying selected properties of LDAP://server/o=org/cn=obj
   displayName            : Display Name
   whenCreated            : 7/8/2009 7:29:02 PM
   whenChanged            : 7/8/2009 10:42:23 PM
   uSNCreated             : System.__ComObject
   uSNChanged             : System.__ComObject

Wie konvertiere ich das System .__ ComObject in ein Int64?

Verwendete Lösung:

Dies ist die Lösung, die ich basierend auf der folgenden Lösung von marc_s verwendet habe:

    public static Int64 ConvertADSLargeIntegerToInt64(object adsLargeInteger)
    {
         var highPart = (Int32)adsLargeInteger.GetType().InvokeMember("HighPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
         var lowPart  = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart",  System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
         return highPart * ((Int64)UInt32.MaxValue + 1) + lowPart;
    }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage