2011-09-21 7 views
1

J'utilise l'échange powershell en C# comme ceci:Exchange 2010 Powershell + C#: comment faire Où requête

public PowershellResult GetSendAsPermissions(string TargetIdentity) 
    { 
     string CommandName = "get-adpermission"; 

     Command cmd1 = new Command(CommandName); 
     cmd1.Parameters.Add("Identity", TargetIdentity); 
     if (powershell.DomainController.Length > 0) 
     { 
      cmd1.Parameters.Add("DomainController", powershell.DomainController); 
     } 

     List<Command> commands = new List<Command>(); 
     commands.Add(cmd1); 
     string errorMessages = string.Empty; 
     Collection<PSObject> commandResults = powershell.ExecutePowershellCommand(commands, out errorMessages); 


     PowershellResult psr = null; 

     if (errorMessages.Length == 0) 
     { 
      psr = new PowershellResult(true, "Successfully managed SendAs permission.", 0); 
     } 
     else 
     { 
      psr = new PowershellResult(false, string.Format("Error managing SendAs permission: {0}", errorMessages), 0); 
     } 
     return psr; 
    } 

public Collection<PSObject> ExecutePowershellCommand(List<Command> commands, out string errorMessages) 
    { 
     errorMessages = ""; 
     this.ps.Commands.Clear(); 
     ps.Streams.Error.Clear(); 
     if (commands != null) 
     { 
      foreach (Command cmd in commands) 
      { 
       this.ps.Commands.AddCommand(cmd); 
      } 
      Collection<PSObject> ret = null; 
      try 
      { 
       ret = this.ps.Invoke(); 
       if (this.ps.Streams.Error.Count > 0) 
       { 
        StringBuilder stb = new StringBuilder(); 
        foreach (ErrorRecord err in this.ps.Streams.Error) 
        { 
         if (err.Exception.Message != null) 
         { 
          stb.AppendLine(err.Exception.Message); 
         } 
        } 
        errorMessages = stb.ToString(); 
       } 
      } 
      catch (Exception ex) 
      { 
       StringBuilder stb = new StringBuilder(); 
       if (ex.Message != null) 
       { 
        stb.Append(ex.Message); 
       } 
       if (ex.InnerException != null) 
       { 
        if (ex.InnerException.Message != null) 
        { 
         stb.Append(string.Format(" {0}", ex.InnerException)); 
        } 
       } 
       errorMessages = stb.ToString().Trim(); 
      } 

      return ret; 
     } 
     else 
     { 
      return null; 
     } 
    } 

Maintenant, je veux ajouter un "where" à la commande get-ADPermission comme ceci:

Get-ADPermission | where {($_.ExtendedRights -like “*Send-As*”) -and ($_.IsInherited -eq $false) -and -not ($_.User -like “NT AUTHORITY\SELF”)} 

Je ne sais absolument pas où mettre la clause where ou comment définir ces arguments entre accolades. Quelqu'un a une idée?

Répondre

1

Je vois

Collection<PSObject> commandResults = powershell.ExecutePowershellCommand(commands, out errorMessages); 

mais rien ne se fait avec commandResults - ils ne sont pas transmis à l'appelant.

Ce qu'il semble que vous aurez besoin est quelque chose comme

var filteredResults = commandResults.Where(cr =>  
     (((string)cr.Properties["ExtendedRights"].Value).Contains("Send-As")) && 
     (((bool)cr.Properties["IsInherited"].Value) == false) && 
     (((string)cr.Properties["User"].Value) == "NT AUTHORITY\\SELF")) 

Ce sera (je l'espère), vous obtenez une liste filtrée comandResults avec uniquement les éléments dont vous avez besoin. Vous voudrez transmettre cela à l'appelant ou faire quelque chose d'autre avec lui.

+0

Le fait est que "Valeur" est simplement du type "objet" donc il n'a pas la méthode "Contient" dessus ... – hoetz

+0

Ah, OK, nous devons lancer une chaîne. Voir la mise à jour –

+0

Encore quelques exceptions comme PSObject ne peuvent pas être lancées en chaîne, supposons qu'il ya beaucoup de casting et de vérification à faire ... – hoetz

Questions connexes