使用DirectoryEntry无法获得AD属性(LAPS属性)

时间:2018-12-03 08:52:57

标签: c# .net active-directory

我遇到了无法通过DirectoryEntry检索AD属性的问题。 我可以通过DirectorySearcher来获取它,但是我无法通过DirectoryEntry来获取或设置它。

所需的属性是ms-Mcs-AdmPwdExpirationTime,其中包含一个NT时间戳,我已经读写了该属性。

DirectoryEntry控制台中的C#错误

  

对COM组件的调用已返回错误HRESULT E_FAIL

我尝试使用以下内容,但仍无法检索该属性。

RefreshCache (string[] propertyNames);

编辑:

ComputerPrincipal comp = ComputerPrincipal.FindByIdentity(ctx, MachineName);
DirectoryEntry de = (DirectoryEntry)comp.GetUnderlyingObject();
if (de.Properties.Contains("ms-Mcs-AdmPwd") == true)
{
    string Password = (String)de.Properties["ms-Mcs-AdmPwd"][0];
    Password_Input.Text = Password;
    DateTime NTTime = DateTime.FromFileTime(ConvertLargeIntegerToLong(de.Properties["ms-Mcs-AdmPwdExpirationTime"].Value));
    PasswordExpiry_Value.Text = NTTime.ToString("dd/MM/yyyy hh:mm:ss");
    Console.WriteLine();
}
else
{
    Password_Input.Text = "Password not set by LAPS";
}
// down the bottom of the .cs
private static long ConvertLargeIntegerToLong(object largeInteger)
{
    var type = largeInteger.GetType();
    var highPart = Convert.ToInt32(type.InvokeMember("HighPart", BindingFlags.GetProperty, null, largeInteger, null));
    var lowPart = Convert.ToInt32(type.InvokeMember("LowPart", BindingFlags.GetProperty, null, largeInteger, null));
    return (long)highPart << 32 | (uint)lowPart;
}

1 个答案:

答案 0 :(得分:1)

过去用于设置属性,我已将其用于目录条目

路径是对象的完整LDAP路径,但是您可以在上面的示例中替换de。 希望这足以解决您的问题,或者至少为您指明方向。

还有其他一些答案here,说明为什么可能会出现该错误。

还有here

 public Boolean set_AD_property(string attribute_, string new_value)
    {
        this.AD_object = new DirectoryEntry(this.path_);
        this.AD_object.Properties[attribute_].Value = new_value;
        try
        {
            this.AD_object.CommitChanges();
            this.AD_object.Close();
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
    }

阅读:

  public object get_AD_property(string attribute_)
    {
        try
        {
            using (this.AD_object = new DirectoryEntry(this.path_))
            {
                return this.AD_object.Properties[attribute_].Value;
            }
        }
        catch (ArgumentNullException x)
        {
            return new ArgumentNullException(x.Message, x);
        }
    }

尽管这不适用于“ members”或“ memberOf”之类的更复杂的属性