2017-12-25 21 views
0

質問があります。 私はvb.net と私のコマンドをCMDのADユーザーのパスワードを変更しようとしています:VB.NETとdsmod

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

64ビットプログラムとしてしか使用できない種類のコマンドです。プロジェクト>プロパティ>コンパイルタブを選択し、「32ビット優先」チェックボックスを選択解除します。ドキュメントはUACの高度が必要であることを言及しています、https://stackoverflow.com/a/2818776/17034 –

答えて

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) 

私はまた、引用符を開始一致がなかったので、あなたは、引数の最後に置か余分な二重引用符を除去する自由を取りました。

注:動的に現在のシステムのSystem32フォルダを取得するために

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

システムフォルダがC:\ドライブ以外のドライブに配置される可能性がありますので、私はこのコードを使用していました。たとえば、システムドライブの文字がD:\の場合、このコードはD:\Windows\System32を返します。


EDIT:

dsmodは、64ビットのシステムディレクトリにのみ利用可能であることが表示されます。アプリケーションが32ビットアプリケーションの場合は、SysWOW64にあるCMDの32ビット版も起動するので、System32ディレクトリにある64ビット版を強制的に開く必要があります。これを行うには、CMDのフルパスを指定する必要がありますが、Sysnativeディレクトリに指定してください。

System32の代わりにSysnativeを指定すると、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) 
+0

返信ありがとう、私は作業ディレクトリとしてSystem32を取得しますが、私はまだ同じエラーを取得します... – user7406533

+0

@ user7406533:私の編集を参照してください。 –

+0

これはうまくいった、ありがとう!私はこの答えを見たまで、これを行うには、もっと短く簡単な方法(PowerShellを使って)が2行だけであることがわかりました... Dim psi as New ProcessStartInfo( "powershell.exe"、 "$ newpwd = ConvertTo-SecureString -String"& "" ""&TextBox1。テキストと "" ""& "-AsPlainText -Force; Set-ADAccountPassword管理者-NewPassword $ newpwd -Reset")と2行目Dim Process As Process = Process.Start(psi)...しかし、返信ありがとう... – user7406533