我有个问题。我正在尝试使用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.
我怎样才能解决这个问题?谢谢
默认情况下,通过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
),因此您必须强制它打开位于System32
目录中的64位版本。要做到这一点,你必须指定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)