我有一个问题。 我尝试使用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.
我该如何解决这个问题? 感谢
答案 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)