C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: "net use"コマンドの戻り値を取得


(過去ログ 140 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■81902 / inTopicNo.1)  "net use"コマンドの戻り値を取得
  
□投稿者/ ごう (10回)-(2016/11/21(Mon) 13:11:12)

分類:[ASP.NET (C#)] 

サーバOS : Windows Server 2012 R2
クライアントOS : Windows 7
クライアントのWebブラウザ : IE11

ASP .NETを使用したWebシステムを作成しています。
別サーバにフォルダを作成するために、
System::Diagnostics::Process クラスを使用し、net useコマンドを呼んでいます。

"net use"コマンドの戻り値を取得するようにした場合、
処理が停止してしまいます。(ブラウザが固まる)

net useコマンド(他にもmkdirコマンドなど)の戻り値(成功or失敗)を取得するようにしたいです。
実現のために必要なヒントをご教示お願いいたします。


[実装したコード]

    System.Diagnostics.Process pro = new System.Diagnostics.Process();

    pro.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");               
    pro.StartInfo.Arguments = @"net use \\(サーバ)\(フォルダ) /USER:(サーバ)\(ユーザ名)(パスワード)"; 
    pro.StartInfo.CreateNoWindow = true;            
    pro.StartInfo.UseShellExecute = false;          
    pro.StartInfo.RedirectStandardOutput = true;    

    pro.Start();

    string output ="";
    
    output = pro.StandardOutput.ReadToEnd(); ← ここで固まる

引用返信 編集キー/
■81903 / inTopicNo.2)  Re[1]: "net use"コマンドの戻り値を取得
□投稿者/ shu (940回)-(2016/11/21(Mon) 14:10:40)
No81902 (ごう さん) に返信

%ComSpec% = cmd
はそのままだとコマンド実行後終了しません。
なのでReadToEndとしても標準出力への出力が終了しないため
提示のような現象が発生します。

cmdのパラメータに /C を付加するとコマンド実行後に
終了しますので標準出力への出力が終了となりプロセスも終了します。



引用返信 編集キー/
■81904 / inTopicNo.3)  Re[2]: "net use"コマンドの戻り値を取得
□投稿者/ 774RR (463回)-(2016/11/21(Mon) 15:44:06)
サーバは何だろう? IIS? IISexpress?
サーバソフトの実効ユーザと web service ワーカプロセスの実効ユーザは違うので net use しても意味ないかも。

結果の errorlevel を取得するだけなら WaitForExit して ExitCode を取るだけでよくて
標準出力をパイプ経由で取得する必要はないはず。
標準出力・標準エラーの文言は地域化されているので、これを使うと移植性が無くなるからやめたほうが。

などなど事前検討がもっといろいろ必要な気がするです。

この方式での pro.ExitCode は cmd.exe の終了コードであって net.exe の終了コードではないわけだ。
cmd /c net use で net.exe がエラーした場合には cmd.exe もエラーコード返してくんないと
pro.ExitCode を見ても意味が無いような気がする。
cmd.exe は、自身が終了するとき、現在の errorlevel をそのまま cmd.exe の終了コードとする仕様だっけ?
どこかに何か文書があるかな?オイラも知りたい。

引用返信 編集キー/
■81911 / inTopicNo.4)  Re[3]: "net use"コマンドの戻り値を取得
□投稿者/ ごう (11回)-(2016/11/22(Tue) 15:59:50)
2016/11/22(Tue) 16:00:15 編集(投稿者)

shuさん

"/C"を追加することで対応できました。
ありがとうございます。


774RRさん

コメントありがとうございます。
サーバは IISです。
サーバのローカルアカウントを使用していますので、
net useした後 mkdirコマンドでフォルダを生成できるところまでは確認できました。

ヘルプを今読んでいるのですが、net.exeが失敗したときのエラーを
返すところを探さないといけないのですね。

https://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.standardoutput%28v=vs.110%29.aspx
https://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.exitcode%28v=vs.110%29.aspx

ほしい情報が見つけられていないので、引き続き調査します。


引用返信 編集キー/
■81927 / inTopicNo.5)  Re[4]: "net use"コマンドの戻り値を取得
□投稿者/ 774RR (464回)-(2016/11/24(Thu) 14:18:39)
調べたところ StartInfo.FileName は 「ファイル名を指定して実行」 と同じ指定ができるとのこと。
つまり <中略> NET.EXE が正しく PATH 中に存在するとき

StartInfo.FileName="net"; // "net.exe" でも同じこと
StartInfo.Arguments = @" use K: \\server\share";
だけで行けちゃうっぽい。

オイラの一般ユーザーログイン状況下で
K: のネットドライブが無い状態で、このコードを実行すると pro.ExitCode は 0 (K: が接続された)
K: のネットドライブがある状態で、このコードを実行すると pro.ExitCode は 2 (K: は変化無し)
わざわざ ComSpec 経由で使わなくても動く様子です。
これならまず確実に net.exe の終了コードが取れるでしょう。

※ウチの apache httpd サーバは PATH を最小限にして起動するようにしています(セキュリティ対策)
IIS も同じようにセキュリティ対策で環境変数を最小にしているかもしれないで確認は必要です。

<独り言>
[ファイル名を指定して実行] に mkdir d:\work\hoge と入力したら mkdir できちゃったです。
知らんかった・・・

引用返信 編集キー/
■82043 / inTopicNo.6)  Re[5]: "net use"コマンドの戻り値を取得
□投稿者/ ごう (12回)-(2016/12/02(Fri) 11:35:41)
>774RR さん

> 調べたところ StartInfo.FileName は 「ファイル名を指定して実行」 と同じ指定ができるとのこと。

> <独り言>
> [ファイル名を指定して実行] に mkdir d:\work\hoge と入力したら mkdir できちゃったです。
> 知らんかった・・・


コメントありがとうございました。遅くなりすみません。
上記について、私も知らなかったです。勉強になりました。

2006年の.NET Framework 1.1にも記載されていますね。(2016年の記事は英語表記ですが書かれていますね)
https://msdn.microsoft.com/ja-jp/library/aa326952%28v=vs.71%29.aspx

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -