【问题标题】:How to change System.DirectoryEntry "uSNChanged" attribute value to an Int64如何将 System.DirectoryEntry“uSNChanged”属性值更改为 Int64
【发布时间】:2010-11-09 05:13:40
【问题描述】:

我正在尝试获取目录服务对象的“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 : 显示名称 创建时间:2009 年 7 月 8 日下午 7:29:02 更改时间:2009 年 7 月 8 日晚上 10:42:23 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;
    }

【问题讨论】:

    标签: active-directory directoryservices directoryentry int64


    【解决方案1】:

    我在我的 ADSI 浏览器中使用这个 sn-p 代码 BeaverTail,它是用 C# 编写的:

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

    据我所知,这应该可以正常工作。

    马克

    【讨论】:

    • 对于想要使用此解决方案的人,您需要在项目中包含对 ActiveDs 的 COM 引用,因为 IADsLargeInteger 不是本机 .NET 接口。这很好用!对于我的解决方案,我不想引入 ActiveDs 参考,所以我做了一个类似的解决方案,但使用了一些反射魔法。请参阅我编辑的问题以了解我确定的解决方案
    • iLargeInt = ((Int64)int64Val.HighPart) << 32 + int64Val.LowPart; 会更好
    【解决方案2】:

    看起来它是IADsLargeInteger 类型,因此需要一点互操作魔法来提取值。 This Thread 包含一个示例 VB 实现——并提到了与你自己类似的问题——但是我现在还无法验证它的有用性。希望这可以帮助。

    【讨论】:

    • 感谢您的回答。你也是正确的,但我将 Marc 的答案标记为正确,因为他实际上提供了一个源 sn-p。
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2018-12-28
    • 2013-01-06
    相关资源
    最近更新 更多