2017-12-25 2 views
0

Ich habe eine Frage. Ich versuche, ein AD-Benutzerkennwort in cmd mit vb.net Mein Befehl zu ändern:VB.NET und dsmod

dsmod user "CN=admin,OU=Admins,OU=Users,DC=DOMAIN,DC=LOCAL" -pwd test1 

in einem regelmäßigen cmd nicht als admin (WIN + R - cmd) es perfekt

dsmod succeeded:CN=admin,OU=Admins,OU=Users,DC=DOMAIN,DC=LOCAL 
arbeitet

Aber wenn ich den gleichen Befehl durch vb.net ausführen:

Process.Start("cmd.exe", "/k dsmod user " & """" & "CN=admin,OU=Admins,OU=Users,DC=DOMAIN,DC=LOCAL" & """" & " -pwd " & TextBox1.Text & """") 

ich:

'dsmod' is not recognized as an internal or external command, 
operable program or batch file. 

Wie kann ich das beheben? Danke

+1

Es ist die Art von Befehl, der nur als 64-Bit-Programm verfügbar ist. Wählen Sie Projekt> Eigenschaften> Registerkarte Übersetzen, deaktivieren Sie das Kontrollkästchen "32-Bit bevorzugen". Die Dokumente erwähnen, dass UAC-Erhöhung erforderlich ist, https://Stackoverflow.com/a/2818776/17034 –

Antwort

0

Standardmäßig erhält jeder Prozess, den Sie durch Process.Start() starten, das gleiche Arbeitsverzeichnis wie Ihre Anwendung. Die dsmod.exe-Datei befindet sich höchstwahrscheinlich in System32, Sie müssen also das Arbeitsverzeichnis des neuen Prozesses so einstellen, dass es die Datei findet.

Dim psi As New ProcessStartInfo("cmd.exe", "/k dsmod user " & """" & "CN=admin,OU=Admins,OU=Users,DC=DOMAIN,DC=LOCAL" & """" & " -pwd " & TextBox1.Text) 
psi.WorkingDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32") 

Process.Start(psi) 

nahm ich auch die Freiheit, die zusätzlichen doppelten Anführungszeichen Entfernen Sie am Ende der Argumente, da es keine passenden Start Zitat hatte.

HINWEIS: Da das System-Ordner auf einem anderen Laufwerk als der C:\ Laufwerk befinden könnte ich diesen Code verwendet:

Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32") 

, um dynamisch den System32 Ordner des aktuellen Systems zu erhalten. Wenn beispielsweise das Systemlaufwerk den Buchstaben D:\ hat, gibt dieser Code D:\Windows\System32 zurück.


EDIT:

Es scheint, dass dsmod nur in dem 64-Bit-Systemverzeichnis verfügbar ist. Wenn Ihre Anwendung eine 32-Bit-Anwendung ist, startet sie auch eine 32-Bit-Version von CMD (befindet sich in SysWOW64). Sie müssen daher die 64-Bit-Version im Verzeichnis System32 öffnen. Um dies zu tun, müssen Sie den vollständigen Pfad von CMD angeben, aber im Verzeichnis Sysnative.

Durch Angabe von Sysnative anstelle von System32 verhindern Sie, dass das System Sie in das Verzeichnis SysWOW64 für Ihre 32-Bit-App umleitet.

Dim CmdPath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), If(Environment.Is64BitProcess OrElse Environment.Is64BitOperatingSystem = False, "System32", "Sysnative"), "cmd.exe") 

Dim psi As New ProcessStartInfo(CmdPath, "/k dsmod user " & """" & "CN=admin,OU=Admins,OU=Users,DC=DOMAIN,DC=LOCAL" & """" & " -pwd " & TextBox1.Text) 
psi.WorkingDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32") 

Process.Start(psi) 
+0

Danke für die Antwort, ich bekomme System32 als Arbeitsverzeichnis, aber ich bekomme immer noch den gleichen Fehler ... – user7406533

+0

@ user7406533: Siehe meine Bearbeitung. –

+0

Das hat funktioniert, Danke! Bis ich diese Antwort sah, fand ich einen kürzeren und einfacheren Weg (mit PowerShell) es ist nur 2 Zeilen ... Dim psi als neue ProcessStartInfo ("powershell.exe", "$ newpwd = ConvertTo-SecureString-String" & "" "" & TextBox1.Text & "" "" & "-AsPlainText -Force; Set-ADAccountPassword admin -NewPassword $ newpwd -Reset") und 2. Zeile Dim-Prozess Als Process = Process.Start (psi) ... Aber danke für die Antwort ... – user7406533