Как конвертировать userAccountControl в 0 или 1 - PullRequest
0 голосов
/ 27 апреля 2020

В настоящее время я работаю с AD и извлекаю данные из AD и сохраняю в файл. Поскольку мне не нужен какой-либо код состояния, мне интересно только проверить, является ли учетная запись пользователя 512 - Включить или 514 - Отключить и преобразовать в значение bool. Вот мой код

public static List<Korisnik> VratiKorisnike()
{
    List<Korisnik> lstADUsers = new List<Korisnik>();
    string sDomainName = "sasaos";
    string DomainPath = "LDAP://" + sDomainName;



    string constring = @"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=DesignSaoOsig1;  Integrated Security=True";
    string Query = "SELECT * FROM tblZaposleni_AD";
    DataTable table = new DataTable();
    SqlDataAdapter adapter = new SqlDataAdapter(Query, constring);
    adapter.Fill(table);

    string txt = "";
    string fileLoc = @"C:\output.txt";

    foreach (DataRow row in table.Rows)
    {
        string line = "";
        foreach (DataColumn column in table.Columns)
        {
            line += "," + row[column.ColumnName].ToString();
        }
        txt += line.Substring(1);
    }
    using (var sw = new StreamWriter(fileLoc))
    {
        sw.WriteLine(txt);
    }

    Console.WriteLine("Ok");

    DirectoryEntry searchRoot = new DirectoryEntry(DomainPath);
    DirectorySearcher search = new DirectorySearcher(searchRoot);


    search.Filter = "(&(objectClass=user)(objectCategory=person))";

    search.PropertiesToLoad.Add("samaccountname"); // Username
    search.PropertiesToLoad.Add("displayname"); // display name
    search.PropertiesToLoad.Add("userAccountControl");  // isEnabled
    search.PropertiesToLoad.Add("pwdLastSet"); //passwordExpires



    DataTable resultsTable = new DataTable();
    resultsTable.Columns.Add("samaccountname");
    resultsTable.Columns.Add("displayname");
    resultsTable.Columns.Add("Neaktivan");
    resultsTable.Columns.Add("dontexpirepassword");

    SearchResult result;

    SearchResultCollection resultCol = search.FindAll();

    if (resultCol != null)
    {
        for (int counter = 0; counter < resultCol.Count; counter++)
        {
            string UserNameEmailString = string.Empty;

            result = resultCol[counter];

            if (result.Properties.Contains("samaccountname")
                && result.Properties.Contains("displayname"))
            {
                int userAccountControl = Convert.ToInt32(result.Properties["userAccountControl"][0]);
                string samAccountName = Convert.ToString(result.Properties["samAccountName"][0]);

                int isEnable;
                int Dont_Expire_Password;

                if (userAccountControl > 0)
                {
                    isEnable = 0;
                }
                else
                {
                    isEnable = 1;
                }


                if ((userAccountControl & 65536) != 0)
                {
                    Dont_Expire_Password = 1;
                }
                else
                {
                    Dont_Expire_Password = 0;
                }




                Korisnik korisnik = new Korisnik();
                korisnik.Username = (result.Properties["samaccountname"][0]).ToString();
                korisnik.DisplayName = result.Properties["displayname"][0].ToString();
                korisnik.isEnabled = Convert.ToBoolean(result.Properties["userAccountControl"][0]);


                DataRow dr = resultsTable.NewRow();
                dr["samaccountname"] = korisnik.Username.ToString();
                dr["displayname"] = korisnik.DisplayName.ToString();
                dr["neaktivan"] = Math.Abs(isEnable);
                dr["dontexpirepassword"] = Dont_Expire_Password;

                resultsTable.Rows.Add(dr);
                lstADUsers.Add(korisnik);
            }
        }
        var json = JsonConvert.SerializeObject(resultCol, Formatting.Indented);
        var res = json;
        Console.WriteLine("Ispis uspjesno obavljen");
        Console.ReadLine();
        File.WriteAllText(fileLoc, json);
    }
    return lstADUsers;
}

Любая идея, как решить эту проблему, я был бы очень благодарен. Так толсто, что я пытаюсь

if (userAccountControl == 512)
                        {
                            dr["neaktivan"] = "Account Enabled";
                        }
                        if (userAccountControl == 514)
                        {
                            dr["neaktivan"] = "Account Disabled";
                        }

Не показывает в моем output.txt никакого результата

{
    "Path": "LDAP://sarajevoosigura/CN=Aldin Smajović,OU=Sarajevo,OU=People,DC=sarajevoosiguranje,DC=ba",
    "Properties": {
      "displayname": [
        "John Smith"
      ],
      "useraccountcontrol": [
        514
      ],
      "samaccountname": [
        "jsmith"
      ],
      "adspath": [
        "LDAP://test/CN=JohnSmith,OU=New York,OU=People,DC=sasa,DC=ba"
      ],
      "pwdlastset": [
        132295140030347373
      ]
    }
  },

1 Ответ

1 голос
/ 27 апреля 2020

Не думайте о числах 512 или 514, поскольку они на самом деле не имеют отношения к тому, что вы пытаетесь найти. Атрибут userAccountControl является битовым флагом, означающим, что каждый бит (0 или 1) в двоичном значении является флагом, который означает что-то (1 включено, а 0 является выкл). Десятичное представление всех этих битов может быть всевозможными значениями. Например, десятичное значение может быть 512 или 514 или даже 65538 (если учетная запись отключена и имеет «пароль не истек»). Поэтому игнорируйте десятичное значение.

Второй бит - это флаг «отключен». Если второй бит 1, учетная запись отключена. Это то, что вы хотите найти.

Ответ Джона действительно помогает найти это, но он (немного) слишком сложен.

Вы уже проводите надлежащий тест на "не истекает" флаг пароля:

if ((userAccountControl & 65536) != 0)

65536 - это 10000000000000000 в двоичном формате. Так что оператор if говорит "если установлен 17-й бит". Вам просто нужно сделать то же самое для второго бита, чтобы выяснить, отключен ли он:

if (userAccountControl & 2 != 0)
{
    isEnable = 1;
}
else
{
    isEnable = 0;
}

Подробнее о «логическом операторе И» можно прочитать здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/bitwise-and-shift-operators#logical - и-operator-

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