Как программно обновить и удалить пользователей LDAP из SQL? - PullRequest
0 голосов
/ 03 декабря 2011

Итак, я хочу получить некоторые значения ldap и вставить их в базу данных с шифрованием.У меня вставка работает, но мне нужно проверить, является ли пользователь все еще частью группы, и если нет, удалить его из БД, и, если был добавлен новый пользователь, он вставляет их вместо вставки существующих пользователей.Можете ли вы дать мне руководство по лучшим методам для этого?Я бы предпочел не обрезать таблицу и заново вставить все.

        try
        {
            /* Connection to Active Directory */
            DirectoryEntry deBase = new DirectoryEntry("LDAP://" + txtLDAP.Text + ":" + txtLDapPort.Text + "/" + txtBadeDN.Text, txtUsername.Text, txtPassword.Text, AuthenticationTypes.Secure);

            /* Directory Search*/
            DirectorySearcher dsLookForGrp = new DirectorySearcher(deBase);
            dsLookForGrp.Filter = String.Format("(cn={0})", txtGroup.Text);
            dsLookForGrp.SearchScope = SearchScope.Subtree;
            dsLookForGrp.PropertiesToLoad.Add("distinguishedName");
            SearchResult srcGrp = dsLookForGrp.FindOne();

            /* Directory Search
             */
            DirectorySearcher dsLookForUsers = new DirectorySearcher(deBase);
            dsLookForUsers.Filter = String.Format("(&(objectCategory=person)(memberOf={0}))", srcGrp.Properties["distinguishedName"][0]);
            dsLookForUsers.SearchScope = SearchScope.Subtree;
            dsLookForUsers.PropertiesToLoad.Add("objectSid");
            dsLookForUsers.PropertiesToLoad.Add("sAMAccountName");
            SearchResultCollection srcLstUsers = dsLookForUsers.FindAll();

            StringBuilder sbUsers = new StringBuilder();

            foreach (SearchResult sruser in srcLstUsers)
            {
                SecurityIdentifier sid = new SecurityIdentifier((byte[])sruser.Properties["objectSid"][0], 0);
                string ConnString = "ConnectionString Removed";
                string SqlString = "spInsertADAuthorization";
                using (OleDbConnection conn = new OleDbConnection(ConnString))
                {
                    using (OleDbCommand cmd = new OleDbCommand(SqlString, conn))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.AddWithValue("AD_Account", SpartaCrypto.SpartaEncryptAES(sruser.Properties["sAMAccountName"][0].ToString(), "thisisasharedsecret"));
                        cmd.Parameters.AddWithValue("AD_SID", SpartaCrypto.SpartaEncryptAES(sid.ToString(), "thisisasharedsecret"));
                        cmd.Parameters.AddWithValue("AD_EmailAddress", "user@host.com");
                        cmd.Parameters.AddWithValue("DateImported", DateTime.Now.ToString());
                        cmd.Parameters.AddWithValue("Active", 1);
                        conn.Open();
                        cmd.ExecuteNonQuery();
                        conn.Close();
                    }
                }
                lblResults.Text = srcLstUsers.Count + " Users granted access.";
            }
        }

        catch (Exception ex)
        {
            if (ex.Message.Contains("Logon failure"))
            {
                lblResults.Text = "Logon Failure.  Check your username or password.";
            }

            if (ex.Message.Contains("The server is not operational"))
            {
                lblResults.Text = "LDAP Error.  Check your hostname or port.";
            }
            if (ex.Message.Contains("Object reference not set to an instance of an object"))
            {
                lblResults.Text = "LDAP Error.  Check your hostname, port, or group name and try again.";
            }


        }

1 Ответ

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

Поскольку вы работаете в .NET 3.5 и выше, вам следует проверить пространство имен System.DirectoryServices.AccountManagement (S.DS.AM).Прочитайте все об этом здесь:

Вы можете использовать PrincipalSearcher и принципала «запрос по примеру» для выполнения поиска:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// define a "query-by-example" principal - here, we search for a UserPrincipal 
// and with the first name (GivenName) of "Bruce"
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.GivenName = "Bruce";

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
}

Для работы с одним принципалом, программированиеИнтерфейс также намного приятнее:

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

if(user != null)
{
   // do something here... you can access most of the commonly used properties easily
   user.GivenName = "....";
   user.Surname = "......";
   user.SamAccountName = ".....";
}

// find the group in question
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere");

// if found....
if (group != null)
{
   // iterate over members
   foreach (Principal p in group.GetMembers())
   {
      Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName);
      // do whatever you need to do to those members
   }
}

Новый S.DS.AM значительно упрощает игру с пользователями и группами в AD!

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