2011-09-21 32 views
1

我使用的是交流的PowerShell在C#這樣的:Exchange 2010的PowerShell的+ C#:如何做到哪裏查詢

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; 
     } 
    } 

現在我想以一個 「where」 子句添加到Get-adpermission命令像這樣:

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

我絕對不知道在哪裏把where子句或如何在大括號中定義這些參數。任何人有想法?

回答

1

我看到

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

,但沒有與commandResults做 - 他們不傳回給調用者。

是什麼樣子,你會需要的是像

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")) 

這將(希望)讓你的comandResults過濾列表與你需要的物品。你會想要以某種方式將它傳回給調用者,或者用它們做別的事情。

+0

事情是,「價值」只是類型「對象」,所以它沒有方法「包含」它... – hoetz

+0

啊,好的,我們需要投到一個字符串。查看更新的答案。 –

+0

還有一些例外,如PSObject不能被轉換爲字符串,猜猜有很多鑄造和檢查要做... – hoetz