2017-10-17 3 views
0

L'objectif: obtenir tous les utilisateurs connectés/déconnectés du système. Les utilisateurs qui se sont connectés/déconnectés en utilisant une connexion de bureau à distance.Exécuter et gérer la sortie du script ps1

Mon script:

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 

Je ne comprends vraiment pas les scripts PS1. J'ai trouvé ce script mais je veux l'utiliser à mes fins.

Lorsque je tente de l'exécuter avec C#:

Scénario 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(); 

Il renvoie une erreur:

PS1 est pas signé numériquement.

Deuxième scénario:

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

cours d'eau sont toujours vides. En fait, il compte toujours 0 ligne.

Une idée/suggestion comment faire ceci?

Répondre

0

J'ai utilisé Write-Output au lieu de Write-Host à la fin du script sans générer de fichier csv. Crédits à this.