7

ディレクトリ サービス オブジェクトの "uSNChanged" 値の Int64 値を取得しようとしています。残念ながら、それは常にある種の COM オブジェクトとして返されます。Int64 へのキャスト、Int64.Parse() の呼び出し、Convert.ToInt64() の呼び出しを試しました。これらのどれも機能しません。

特定の DirectoryEntry オブジェクトについて、このコードはプロパティを表示します。

    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);
        }
    }

これは出力です:

LDAP://server/o=org/cn=obj の選択されたプロパティの表示
   displayName : 表示名
   whenCreated : 2009 年 7 月 8 日 7:29:02 PM
   変更日時: 2009 年 7 月 8 日 10:42:23 PM
   uSNCreated : System.__ComObject
   uSNChanged : System.__ComObject

その System.__ComObject を Int64 に変換するにはどうすればよいですか?


使用したソリューション:

これは、以下の marc_s のソリューションに基づいて使用したソリューションです。

    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;
    }
4

2 に答える 2

6

C# で記述されたADSI ブラウザーBeaverTailで、次のコード スニペットを使用しています。

Int64 iLargeInt = 0;

IADsLargeInteger int64Val = (IADsLargeInteger)oPropValue.LargeInteger;
iLargeInt = int64Val.HighPart * 4294967296 + int64Val.LowPart;

私が知る限り、これはうまくいくはずです。

マルク

于 2009-07-09T05:24:04.647 に答える
2

IADsLargeInteger型のように見えるので、値を抽出するには相互運用の魔法が少し必要になります。このスレッドにはサンプルの VB 実装が含まれており、あなた自身の問題に似た問題について言及していますが、今のところその有用性を確認することはできません。お役に立てれば。

于 2009-07-08T23:33:23.663 に答える