Как изменить значение атрибута "uSNChanged" System.DirectoryEntry на Int64
Я пытаюсь получить значение Int64 значения "uSNChanged" объекта Службы каталогов. К сожалению, он всегда возвращается в качестве 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: отображаемое имя КогдаСоздано: 8.07.2009 19:29:02 whenChanged: 8/7/2009 22: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;
}
2 ответа
Я использую этот фрагмент кода в моем браузере ADSI BeaverTail, который написан на C#:
Int64 iLargeInt = 0;
IADsLargeInteger int64Val = (IADsLargeInteger)oPropValue.LargeInteger;
iLargeInt = int64Val.HighPart * 4294967296 + int64Val.LowPart;
Насколько я могу сказать, это должно работать просто отлично.
Марк
Похоже, это тип IADsLargeInteger, поэтому для извлечения значений потребуется немного магии взаимодействия. Этот поток содержит пример реализации VB - и упоминает о проблемах, похожих на вашу, - однако сейчас я не в состоянии проверить его полезность. Надеюсь это поможет.