Не удается получить атрибут AD с помощью DirectoryEntry (атрибут LAPS)

У меня возникла проблема, когда я не могу получить атрибут AD через DirectoryEntry. Я могу получить его через DirectorySearcher, но я не могу получить или установить его через DirectoryEntry.

Нужен атрибут ms-Mcs-AdmPwdExpirationTime, который содержит метку времени NT, я прочитал и записал этот атрибут.

DirectoryEntry Ошибка C# в консоли

Ошибка HRESULT E_FAIL возвращена при вызове COM-компонента.

Я пытался использовать следующее, но все еще не смог получить атрибут.

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

person FingerlessGloves    schedule 03.12.2018    source источник
comment
вы пытаетесь установить атрибут или просто читаете его? мы можем увидеть код этой ошибки?   -  person Shovers_    schedule 03.12.2018
comment
Я нашел способ прочитать это, но было бы удобно, если бы я мог также установить его. См. Публикация в обновленном коде.   -  person FingerlessGloves    schedule 03.12.2018


Ответы (1)


Для установки свойств в прошлом я использовал это для записей каталогов.

Путь — это полный путь LDAP к объекту, но вы можете заменить его на de в приведенном выше примере. Надеюсь, этого достаточно, чтобы решить вашу проблему или, по крайней мере, указать вам направление.

Есть и другие ответы vs2012-whe">здесь о том, почему вы можете получить эту ошибку.

И здесь

 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».

person Shovers_    schedule 03.12.2018