2015-04-01 162 views
1

嗨我想避免在我的foreach循環(在GetSAM中)打印某些行(有效帳戶),而不是打印所有內容。避免在foreach中打印某些行

當我嘗試通過註銷打印有效帳戶的行(在valSAM中)這樣做時,在有效帳戶曾經存在的區域中將是空白的。我知道這是因爲foreach遍歷數據庫中的所有變量。

我怎樣才能消除輸出之間的差距?

GetSAM:

//Get SAMAccount 
    private static string GetSAM(string ldapAddress, string serviceAccountUserName, string serviceAccountPassword) 
    { 
     string ldapPath = "LDAP://" + ldapAddress; 
     string ldapFilter = "(&(objectclass=user)(objectcategory=person))"; 
     DirectoryEntry directoryEntry = new DirectoryEntry(ldapPath, serviceAccountUserName, serviceAccountPassword); 
     string readOutput; 
     List<string> list = new List<string>(); 
     List<int> invalid = new List<int>(); 
     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(); 
        if (valSAM(samAccountName, ldapAddress, serviceAccountUserName, serviceAccountPassword)!= true) 
        { 
         invalid.Add('1'); 
        } 
        list.Add(samAccountName); 
       } //end of foreach** 
       // Count all accounts 
       int totalAccounts = list.Count; 
       // Count all invalid accounts 
       int invalidAccounts = invalid.Count; 
       Console.WriteLine("Found " + invalidAccounts + " invalid accounts out of " + totalAccounts + " user accounts.\nQuery in " + ldapAddress + " has finished.\n"); 
       Console.WriteLine("Press [enter] to continue.\n"); 
       readOutput = Console.ReadLine(); 
      }//SearchResultCollection will be disposed here 
     } 
     return readOutput; 
    } 

valSAM:

//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.Append("Account is inactive and locked or expired.").Append('\n'); ; 
        } else if (isAccountActived != true) 
        { 
         builder.Append("Account is inactive.").Append('\n'); ; 
        } 
        else if (isAccountLocked) 
        { 
         builder.Append("Account is locked or has expired.").Append('\n'); ; 
        } 
        else 
        { 
         builder.Append("Unknown reason for status. Contact admin for help.").Append('\n'); ; 
        } 
        accountValidation = false; 
       } 
       //account is valid 
       if ((isAccountActived) && (isAccountLocked != true)) 
       { 
       **//builder.Append("User account " + samAccountName + " is valid.").Append('\n'); 
        accountValidation = true; 
       } 
      } 
      else Console.WriteLine("Nothing found."); 
      Console.WriteLine(builder); 
     }//end of using 
     return accountValidation; 
    } 
+0

所以,你要避免打印該帳戶是有效的?那麼怎麼樣在'valSAM'的末尾附近加上'Console.WriteLine(builder)'這行'if(!accountValidation){...}'? – Corak 2015-04-01 08:30:45

+0

Btw。似乎你只是想計算GetSAM中的無效/所有帳戶。那麼你爲什麼填寫名單?爲什麼不只有兩個'int'變量'totalAccounts'和'invalidAccounts',在啓動時用'0'初始化它們,然後在每次向列表中添加一個項目時增量('variable ++;')?另外,你非常非常幸運,就像'List invalid = new List (); invalid.Add('1');'偶數作品... – Corak 2015-04-01 08:37:12

+0

作品!謝謝:) – coder123 2015-04-01 08:38:45

回答

0

你可能想,如果製造商擁有的東西,否則它會打印一個空行只寫。也就是說,如果你要處理所有的新生產線的建造者本身改變

Console.WriteLine(builder); 

if (builder.Length > 0) 
{ 
    Console.WriteLine(builder); 
} 

或只是

Console.Write(builder); 

。如果你打算這樣做,請使用StringBuilder.AppendLine(),而不是像那樣對'\ n'進行硬編碼。

+0

謝謝,但這並不是我真正想要的。祝你有美好的一天 :) – coder123 2015-04-01 08:41:38