Не удается получить атрибут AD с помощью DirectoryEntry (атрибут LAPS) - PullRequest
0 голосов
/ 03 декабря 2018

У меня возникла проблема, когда я не могу получить атрибут 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;
}

1 Ответ

0 голосов
/ 03 декабря 2018

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

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

Есть также некоторые другие ответы здесь о том, почему вы можете получить эту ошибку.

И здесь

 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"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...