2014-04-09 8 views
13

Ich schreibe ein PowerShell-Skript auf einem Windows 8.1-Rechner. Bei dem Versuch, ein PSCredential-Objekt mit dem Cmdlet New-Object zu erstellen, wurde dieser Fehler angezeigt:New-Objekt: Eine Überladung für "PSCredential" und die Anzahl der Argumente nicht gefunden: "2"

New-Object: Eine Überladung für "PSCredential" und die Argumentanzahl "2" konnte nicht gefunden werden.

Das exakt gleiche Skript auf einem anderen Windows 8.1-Rechner laufen funktioniert gut für mich. Ich habe auch überprüft, dass beide Maschinen dieselbe Version von PowerShell 4.0 ausführen

Beide Computer haben das gleiche .NET Framework 4.0 installiert.

Eine Idee, warum das passiert und wie ich dieses Problem lösen könnte?

$userPassword = ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force 
$userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "myUserName", $userPassword 

Nach einigen weiteren Tests, habe ich das Problem herausgefunden. Für meine Funktion wollte ich den Benutzernamen und das Passwort vom Benutzer übernehmen, aber auch Standardwerte angeben, wenn der Benutzer diese Eingabeparameter überspringt.

Dafür habe ich erreicht es durch die folgende Zeile in Parameter Abschnitt Hinzufügen

[string][ValidateNotNullOrEmpty()] $userPassword = "myPassword", 

Es scheint, das Problem ist, dass ich es definiert ein [Zeichenfolge] im Parameter zu sein, aber später versuchen, eine Secure zu sein, was zu dem Problem führte.

Das Entfernen des Attributs [String] in meinem Parameter löste das Problem.

+0

Ich sehe nicht, was das mit C# zu tun hat. Entferntes Tag Sie müssen Ihren Code ebenfalls anzeigen. Es ist extrem schwierig, dir zu helfen, ohne es zu sehen. – tnw

+0

tnw, danke für die Erinnerung. Ich habe meinen Code hinzugefügt und dabei das Problem herausgefunden. – xenoverse

+0

Bitte posten Sie Ihre Lösung als Antwort und akzeptieren Sie sie. –

Antwort

18

In solchen Situationen möchten Sie vielleicht Ihren Parametertyp überprüfen. In diesem speziellen Beispiel wurde der Eingabeparameter als String deklariert. Das Ergebnis von ConvertTo-SecureString gibt jedoch einen SecureString zurück.

Die Fehlermeldung ist in dieser Situation ein wenig irreführend. Das Problem liegt nicht darin, dass es keinen Konstruktor mit zwei Argumenten gibt, sondern weil $ userPassword als String deklariert wurde, aber später in SecureString geändert wurde.

[string][ValidateNotNullOrEmpty()] $userPassword = "myPassword", 

$userPassword = ConvertTo-SecureString -String $userPassword -AsPlainText -Force 
$userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "myUserName", $userPassword 
0

Denken Sie auch daran, dass, wenn Sie nicht über eine bestimmte Anmeldeinformation anders als der aktuelle Berechtigungsnachweis der Person müssen Sie den Befehl (oder Script) ausgeführt wird, können Sie all dies mit einem Einzeiler überspringen können:

$Cred = Get-Credential 

In einem Popup werden Sie aufgefordert, Ihren Benutzernamen und Ihr Passwort einzugeben. Genau so haben Sie Ihre Anmeldeinformationen in einer Variablen erfasst, die Sie in der Befehlszeile verwenden können, oder Sie können dies in einem Skript verwenden, um den Benutzer nach seinen Anmeldeinformationen zu fragen.

Verwandte Themen