VB.NET和dsmod

时间:2017-12-25 21:17:18

标签: vb.net cmd

我有一个问题。 我尝试使用vb.net更改cmd中的AD用户密码 我的命令:

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

在常规cmd中,不是管理员(WIN + R - cmd),它可以完美地运行

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

但是当我通过vb.net运行相同的命令时:

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

我明白了:

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

我该如何解决这个问题? 感谢

1 个答案:

答案 0 :(得分:0)

默认情况下,您通过Process.Start()启动的任何进程都会获得与您的应用程序相同的工作目录。 dsmod.exe文件最有可能位于System32,因此您必须将新进程的工作目录设置为该文件才能找到该文件。

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)

我也冒昧地删除你在参数末尾添加的额外双引号,因为它没有匹配的起始引用。

注意:由于系统文件夹可能位于与C:\驱动器不同的驱动器上,因此我使用了以下代码:

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

以动态获取当前系统的System32文件夹。因此,例如,如果系统驱动器具有字母D:\,则此代码将返回D:\Windows\System32

修改

dsmod似乎仅在64位系统目录中可用。如果您的应用程序是32位应用程序,它还将启动32位版本的CMD(位于SysWOW64),因此您必须强制它打开64位版本的#39 ; s位于System32目录中。要做到这一点,您必须指定CMD的完整路径,但在Sysnative目录中。

通过指定Sysnative而不是System32,您可以阻止系统将您重定向到32位应用的SysWOW64目录。

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)