簡體   English   中英

無法使用remove()從列表中刪除項目

[英]Can't remove items from List with remove()

嗨,我想通過在方法readInput中使用foreach刪除帳戶名稱,該方法將帳戶發送到DisableADUser 方法 ,該方法將禁用帳戶,如果操作成功,則從全局列表invalidAccounts中刪除該名稱(整個代碼行7)。

我嘗試使用Remove方法並將其置於DisableADUser方法的if和else條件中,但是它不起作用。 我應該如何解決這個問題? 提前致謝。 :)

readInput方法(第1至13行)

//Read user input
    private static string readInput(string Input)
    {

        string input = string.Empty;

        switch (Input) 
        {
                case "disable":

                invalidAccount.ForEach(delegate(String samAccountName)
                  {
                      Console.WriteLine('\n' + samAccountName);

                      //disable inactive accounts
                      DisableADUser(samAccountName);

                  });


                  //count number of invalid accounts
                  int invalidAccounts = invalidAccount.Count;

                  Console.WriteLine("\nExecution has completed. ");

                  invalidAccount.Clear();

                  Console.WriteLine("Press [enter] to continue.\n");

                  input = Console.ReadLine();

                  break;

                case "query":

                    Console.WriteLine("\nQuery for expiry has finished.\n");

                    Console.WriteLine("Press [enter] to continue.\n");

                    input = Console.ReadLine();

                    break;

                case "exit":

                    //leave console
                    Environment.Exit(2);

                    break;

                default:
                    throw new Exception("Invalid command entered.");
      }

        return input;
}

disableADUser(第1-15行)

    //disable invalid accounts
    private static void DisableADUser(string samAccountName)
    {
        try
        {
            PrincipalContext principalContext = new PrincipalContext(ContextType.Domain);

            UserPrincipal userPrincipal = UserPrincipal.FindByIdentity
                    (principalContext, samAccountName);

            userPrincipal.Enabled = false;

            userPrincipal.Save();

            if (userPrincipal.Enabled != true)
            {
                Console.WriteLine("Account has been disabled successfully");

                //remove from list invalidAccounts
                invalidAccount.Remove(samAccountName);
            }
            else
            {
                Console.Write("Unable to disable account");

                //invalidAccount.Remove(samAccountName);
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

如果需要,我也包括了我的整個代碼。

namespace ConsoleApplication2
{
class Program
{
    const int UF_LOCKOUT = 0x0010;

    const int UF_PASSWORD_EXPIRED = 0x800000;

    private static List<string> invalidAccount = new List<string>();

    static void Main(string[] args)
    {

        string line;

        Console.WriteLine("Welcome to account validator V1.1.\n");

        do
        {

        Console.WriteLine("Please enter service account username, password \nand desired ldap address to proceed.\n\n");

        //pass username to GetInput method
        String serviceAccountUserName = GetInput("Username");

        //pass password to GetInput method
        String serviceAccountPassword = GetInput("Password");

        //pass ldap address to GetInput method
        String ldapAddress = GetInput("Ldap address");

        try
        { 

            using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, ldapAddress))
            {
                bool isValid = false;

                // validate the credentials
                isValid = pc.ValidateCredentials(serviceAccountUserName, serviceAccountPassword);

                if (isValid)
                {

                    Console.WriteLine("\nQuerying for users from domain " + ldapAddress + " now.\n\n");

                        //pass login details to GetSAM method
                        GetSAM(ldapAddress, serviceAccountUserName, serviceAccountPassword);

                        Console.WriteLine("\nEnter exit to leave.\n");

                        Console.WriteLine("Enter disable to disable the invalid accounts.\n");

                        Console.WriteLine("Enter query to find the expiry date of valid accounts.\n");

                        string Input = Console.ReadLine();

                        //pass input to readInput method
                        readInput(Input);

                        Console.WriteLine("\nEnter exit to leave.");

                        Console.WriteLine("Press [enter] to query database.");

                }//end of if statement for validate credentials


                else
                {
                    Console.WriteLine("\nInvalid login credentials.\n");

                    Console.WriteLine("Press [enter] and enter exit to leave.");

                    Console.WriteLine("\nPress [enter] [enter] to try again.\n");

                    Console.ReadLine();

                }//end of else statement for validate credentials

            }//end of using

        }//end of try 

        catch (Exception e)
        {
            Console.WriteLine("\nlogin attempt has failed. See exception for more information. ");

            throw new Exception("Log in attempt has failed." + " Exception caught:\n\n" + e.ToString());

        }//end of catch

        }//end of do

        while ((line = Console.ReadLine()) != "exit");

        //Thread.Sleep(60000);
    } //end of main


    //Read user input
    private static string readInput(string Input)
    {

        string input = string.Empty;

        switch (Input) 
        {
                case "disable":

                invalidAccount.ForEach(delegate(String samAccountName)
                  {
                      Console.WriteLine('\n' + samAccountName);

                      //disable inactive accounts
                      DisableADUser(samAccountName);

                  });


                  //count number of invalid accounts
                  int invalidAccounts = invalidAccount.Count;

                  Console.WriteLine("\nExecution has completed. " + invalidAccounts + " invalid accounts have been disabled.");

                  invalidAccount.Clear();

                  Console.WriteLine("Press [enter] to continue.\n");

                  input = Console.ReadLine();

                  break;

                case "query":

                    Console.WriteLine("\nQuery for expiry has finished.\n");

                    Console.WriteLine("Press [enter] to continue.\n");

                    input = Console.ReadLine();

                    break;

                case "exit":

                    //leave console
                    Environment.Exit(2);

                    break;

                default:
                    throw new Exception("Invalid command entered. Please enter command again.");
      }

        return input;
}

    // find password expiry date


    //Get SAMAccount
    private static string GetSAM(string ldapAddress, string serviceAccountUserName, string serviceAccountPassword)
    {

        string readOutput;

        int countAll = 0;

        string ldapPath = "LDAP://" + ldapAddress;

        string ldapFilter = "(&(objectclass=user)(objectcategory=person))";

        DirectoryEntry directoryEntry = new DirectoryEntry(ldapPath, serviceAccountUserName, serviceAccountPassword);

        using (DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry))
        {
            string samAccountName;

            directorySearcher.Filter = ldapFilter;

            directorySearcher.SearchScope = SearchScope.Subtree;

            directorySearcher.PageSize = 1000;

            using (SearchResultCollection searchResultCollection = directorySearcher.FindAll())
            {

                foreach (SearchResult result in searchResultCollection)
                {
                    samAccountName = result.Properties["sAMAccountName"][0].ToString();

                    //validate accounts by passing details into valSAM method
                    if (valSAM(samAccountName, ldapAddress, serviceAccountUserName, serviceAccountPassword) != true)
                    {
                        //add invalid account to list invalidAccount
                        invalidAccount.Add(samAccountName);
                    }

                    //count all accounts
                    countAll++;

                }  //end of foreach

                // Count all invalid accounts 
                int invalidAccounts = invalidAccount.Count;

                Console.WriteLine("\nFound " + invalidAccounts + " invalid accounts out of " + countAll + " user accounts.\n");

                Console.WriteLine("Query in " + ldapAddress + " has finished.");

                Console.WriteLine("Press [enter] to continue.\n");

                readOutput = Console.ReadLine();

            }//SearchResultCollection will be disposed here
        }

        return readOutput;

    }


    //Validate SAMAccount
    private static bool valSAM(string samAccountName, string ldapAddress, string serviceAccountUserName, string serviceAccountPassword)
    {
        string ldapPath = "LDAP://" + ldapAddress;

        DirectoryEntry directoryEntry = new DirectoryEntry(ldapPath, serviceAccountUserName, serviceAccountPassword);

        StringBuilder builder = new StringBuilder();

        bool accountValidation = false;

        //create instance fo the directory searcher
        DirectorySearcher desearch = new DirectorySearcher(directoryEntry);

        //set the search filter
        desearch.Filter = "(&(sAMAccountName=" + samAccountName + ")(objectcategory=user))";

        //find the first instance
        SearchResult results = desearch.FindOne();

        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, ldapAddress))
        {

            //if users are present in database
            if (results != null)
            {

                //Check if account is activated
                bool isAccountActived = IsActive(results.GetDirectoryEntry());

                //Check if account is expired or locked
                bool isAccountLocked = IsAccountLockOrExpired(results.GetDirectoryEntry());

                accountValidation = ((isAccountActived != true) || (isAccountLocked));

                //account is invalid 
                if (accountValidation)
                {
                    builder.Append("User account " + samAccountName + " is invalid. ");

                    if ((isAccountActived != true) && (isAccountLocked))
                    {
                        builder.AppendLine("Account is inactive and locked or expired.");
                    } else if (isAccountActived != true)
                    {
                        builder.AppendLine("Account is inactive.");
                    }
                    else if (isAccountLocked)
                    {
                        builder.AppendLine("Account is locked or has expired.") ;
                    }
                    else
                    {
                        builder.AppendLine("Unknown reason. Contact admin for help.");
                    }

                    accountValidation = false;

                }

                //account is valid
                if ((isAccountActived) && (isAccountLocked != true))
                {
                    builder.AppendLine("User account " + samAccountName + " is valid.");

                    accountValidation = true;
                }

            }
            else Console.WriteLine("No users found.");

            //print only invalid accounts
            if (!accountValidation)
            {
                //prevent printing of empty lines
                if (builder.Length > 0)
                {
                    Console.WriteLine(builder);
                }
            }

        }//end of using

        return accountValidation;

    }


    //Prevent empty user input
    private static string GetInput(string Prompt)
    {

        string Result = string.Empty;

        do
        {
            Console.Write(Prompt + ": ");

            Result = Console.ReadLine();

            if (string.IsNullOrEmpty(Result)) Console.WriteLine("Empty input, please try again.\n");

        } 

        while (!(!string.IsNullOrEmpty(Result)));

        return Result;

    }


    //check if account is active
    static private bool IsActive(DirectoryEntry de)
    {
        if (de.NativeGuid == null) return false;

        int flags = (int)de.Properties["userAccountControl"].Value;

        return !Convert.ToBoolean(flags & 0x0002);
    }

    //check if account is locked or expired
    static private bool IsAccountLockOrExpired(DirectoryEntry de)
    {
        string attribName = "msDS-User-Account-Control-Computed";

        de.RefreshCache(new string[] { attribName });

        int userFlags = (int)de.Properties[attribName].Value;

        return userFlags == UF_LOCKOUT || userFlags == UF_PASSWORD_EXPIRED;
    }


    //disable invalid accounts
    private static void DisableADUser(string samAccountName)
    {
        try
        {
            PrincipalContext principalContext = new PrincipalContext(ContextType.Domain);

            UserPrincipal userPrincipal = UserPrincipal.FindByIdentity
                    (principalContext, samAccountName);

            userPrincipal.Enabled = false;

            userPrincipal.Save();

            if (userPrincipal.Enabled != true)
            {
                Console.WriteLine("User " + samAccountName + "'s account has been disabled successfully");

                //remove from list invalidAccounts
                invalidAccount.Remove(samAccountName);
            }
            else
            {
                Console.Write("Unable to disable account");

                //invalidAccount.Remove(samAccountName);
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }


}
}

您無法從要迭代的列表中刪除項目。 它與枚舉器弄亂了,以從其下面刪除內容。 您需要將要保留的項目復制到另一個列表,然后在需要時將其復制回; 或創建要刪除的項目列表,然后一次將其全部刪除。

這里討論了各種方法: 在C#中枚舉時從List <T>中刪除項目的智能方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM