2015-11-11 11 views
5

Ich versuche eine Windows-Formularanwendung in C# zu schreiben, die AD-Attribute für einen bestimmten Benutzer ausgibt. Ich möchte, dass der Benutzer einen Wert (Benutzername) in ein Textfeld eingibt, der als Parameter an das Powershell-Skript übergeben wird und die Ausgabe im Formular angezeigt wird.C# -Parameter an Powershell-Skript übergeben - Argument für Parameter 'Identität' kann nicht validiert werden

Meine C# -Code für die Parameter erstellen und die Skript Aufruf lautet wie folgt:

param([string]$username) 

function Get-XADUserPasswordExpirationDate() { 

Param ([Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, HelpMessage="Identity of the Account")] 

[Object] $accountIdentity) 

PROCESS { 

    $accountObj = Get-ADUser $accountIdentity -properties PasswordExpired, PasswordNeverExpires, PasswordLastSet 

    if ($accountObj.PasswordExpired) { 

     echo ("Password of account: " + $accountObj.Name + " already expired!") 

    } else { 

     if ($accountObj.PasswordNeverExpires) { 

      echo ("Password of account: " + $accountObj.Name + " is set to never expires!") 

     } else { 

      $passwordSetDate = $accountObj.PasswordLastSet 

      if ($passwordSetDate -eq $null) { 

       echo ("Password of account: " + $accountObj.Name + " has never been set!") 

      } else { 

       $maxPasswordAgeTimeSpan = $null 

       $dfl = (get-addomain).DomainMode 

       if ($dfl -ge 3) { 

        ## Greater than Windows2008 domain functional level 

        $accountFGPP = Get-ADUserResultantPasswordPolicy $accountObj 

        if ($accountFGPP -ne $null) { 

         $maxPasswordAgeTimeSpan = $accountFGPP.MaxPasswordAge 

        } else { 

         $maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge 

        } 

       } else { 

        $maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge 

       } 

       if ($maxPasswordAgeTimeSpan -eq $null -or $maxPasswordAgeTimeSpan.TotalMilliseconds -eq 0) { 

        echo ("MaxPasswordAge is not set for the domain or is set to zero!") 

       } else { 

        echo ("Password of account: " + $accountObj.Name + " expires on: " + ($passwordSetDate + $maxPasswordAgeTimeSpan)) 

       } 

      } 

     } 

    } 

} 

} 
Get-XADUserPasswordExpirationDate $username 

Get-ADUser $username -Properties * | Select-Object DisplayName,LockedOut,LastLogonDate,kPMG-User-GOAccountType,kPMG-User-GOCompanyGroup,kPMG-User-GOFunction,kPMG-User-GOGrade,kPMG-User-GOManagementLevel,kPMG-User-GOMemberFirmGroup,kPMG-User-GPID,kPMG-User-GOMailDisclaimer,kPMG-User-GOMailSync 

Wenn ich das Skript in Powershell ausgeführt werden zum Beispiel:

private string RunScript(string scriptText) 
    { 
     // create Powershell runspace 
     Runspace runspace = RunspaceFactory.CreateRunspace(); 

     // open it 
     runspace.Open(); 

     RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace); 

     // create a pipeline and feed it the script text 
     Pipeline pipeline = runspace.CreatePipeline(); 
     pipeline.Commands.AddScript(scriptText); 
     pipeline.Commands.Add(new Command("Set-ExecutionPolicy Unrestricted -Scope Process", true)); 

     // "Get-Process" returns a collection of System.Diagnostics.Process instances. 
     pipeline.Commands.Add("Out-String"); 

     //Create parameter and pass value to script 
     String username = textBox3.Text; 
     String scriptfile = @"c:\\scripts\\getpasswordexpirydate.ps1"; 
     Command myCommand = new Command(scriptfile, false); 
     CommandParameter testParam = new CommandParameter("username", username); 
     myCommand.Parameters.Add(testParam); 

     pipeline.Commands.Add(myCommand); 
     // execute the script 
     Collection<PSObject> results = pipeline.Invoke(); 

     // close the runspace 
     runspace.Close(); 

     // convert the script result into a single string 
     StringBuilder stringBuilder = new StringBuilder(); 
     foreach (PSObject obj in results) 
     { 
      stringBuilder.AppendLine(obj.ToString()); 
     } 

     // return the results of the script that has 
     // now been converted to text 
     return stringBuilder.ToString(); 
    } 

Mein Powershell-Skript wie folgt ist . \ script.ps1 jsmith mit 'jsmith' als Parameter, aber wenn der C# -Parameter verwendet wird, akzeptiert er den Parameter nicht und spuckt jedes Mal einen Fehler aus, der das Argument 'Parameter nicht validieren' validieren kann.

Gibt es etwas, das ich in meinem C# -Code falsch gemacht habe, was dazu führt, dass dieser Parameter nicht an das Skript übergeben und als Eingabe akzeptiert wird?

Dank

Antwort

0

Ein paar Gedanken:

  • Der Name Parameter in dem Code C# ist username
  • Der Name Parameter im Skript ist accountIdentity
  • Die Fehlermeldung verweist Parameter Identity

Ich würde denken, dass alle 3 gleich sein sollten.

Wenn das nicht das Problem ist, dann ist eine Möglichkeit, das Problem zu debuggen, Ihren C# -Code in ein PS-Skript umzuwandeln. Zumindest würde es mir besser fallen, ein PS-Skript zu debuggen, mit dem ich Dinge schnell ändern kann (zB wo Sie myCommand erstellen) und sie (mit get-member und select-object *) untersuchen als mit C#.

Auch zum Debuggen können Sie auch versuchen, alle einzelnen PS-Befehle zu kombinieren, so dass Sie mit einem einzigen Aufruf von AddScript() anstelle von verschiedenen AddCommand() s zusammen mit AddScript() enden. Ich erinnere mich vage an Probleme mit dem Mischen der beiden, als ich vor vielen Jahren einen ähnlichen Code schrieb.

Verwandte Themen