2017-10-17 135 views
0

目标:从系统获取所有登录/注销的用户。 那些通过使用远程桌面连接登录/注销的用户。运行并处理来自ps1脚本的输出

我的脚本:

Param(
    [array]$ServersToQuery = (hostname), 
    [datetime]$StartTime = "January 1, 1970" 
) 

    foreach ($Server in $ServersToQuery) { 

     $LogFilter = @{ 
      LogName = 'Microsoft-Windows-TerminalServices-LocalSessionManager/Operational' 
      ID = 21, 23, 24, 25 
      StartTime = $StartTime 
      } 

     $AllEntries = Get-WinEvent -FilterHashtable $LogFilter -ComputerName $Server 

     $AllEntries | Foreach { 
      $entry = [xml]$_.ToXml() 
      [array]$Output += New-Object PSObject -Property @{ 
       TimeCreated = $_.TimeCreated 
       User = $entry.Event.UserData.EventXML.User 
       IPAddress = $entry.Event.UserData.EventXML.Address 
       EventID = $entry.Event.System.EventID 
       ServerName = $Server 
       }   
      } 

    } 

    $FilteredOutput += $Output | Select TimeCreated, User, ServerName, IPAddress, @{Name='Action';Expression={ 
       if ($_.EventID -eq '21'){"logon"} 
       if ($_.EventID -eq '22'){"Shell start"} 
       if ($_.EventID -eq '23'){"logoff"} 
       if ($_.EventID -eq '24'){"disconnected"} 
       if ($_.EventID -eq '25'){"reconnection"} 
       } 
      } 

    $Date = (Get-Date -Format s) -replace ":", "." 
    $FilePath = "$env:USERPROFILE\Desktop\$Date`_RDP_Report.csv" 
    $FilteredOutput | Sort TimeCreated | Export-Csv $FilePath -NoTypeInformation 

Write-host "Writing File: $FilePath" -ForegroundColor Cyan 
Write-host "Done!" -ForegroundColor Cyan 


#End 

我真的不明白PS1脚本。我发现这个脚本,但我想用它来达到我的目的。

当我尝试用C#来执行它:

方案1:

string scriptText = "C:\\MyPath\\script.ps1"; 
      try 
      { 
       Runspace runspace = RunspaceFactory.CreateRunspace(); 

       // open it 

       runspace.Open(); 

       // create a pipeline and feed it the script text 

       Pipeline pipeline = runspace.CreatePipeline(); 
       pipeline.Commands.AddScript(scriptText); 
    Collection<PSObject> results = pipeline.Invoke(); 

它抛出一个错误:

PS1没有数字签名。

第二种情况:

using (PowerShell PowerShellInstance = PowerShell.Create()) 
      { 
       PowerShellInstance.AddScript(str_Path); 
       Collection<PSObject> PSOutput = PowerShellInstance.Invoke(); 

       if (PowerShellInstance.Streams.Error.Count > 0) 
       { 
        // error records were written to the error stream. 
        // do something with the items found. 
       } 
       } 

流总是空的。实际上它总是数0行。

任何想法/建议如何做到这一点?

回答

0

我使用写输出而不是写主机进入脚本的末尾而不生成csv文件。致谢this