質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

3092閲覧

ASP.NETにてクライアント側にWindowsコマンドプロンプトを実行させるには

kumakumatan

総合スコア213

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/10/26 05:45

ASP.netにてIISのWebサーバを構築しています。
イメージファイルがIISサーバと異なるドメインにファイルサーバとしてあります。

閲覧するクライアントPCもファイルサーバとは異なるドメインに存在していて、
イメージファイルフォルダにアクセスする際、「ユーザ:test\usr1」「パスワード:1234」
が求められるようになっています。この参照をVB側でNET USEコマンドなどをクライアントに実行して閲覧するようにしたく考えています。

aspx

1<iframe src="\111.222.333.444\IMG\test.pdf"></iframe

vb

1'Processオブジェクトを作成 2 Dim p As New System.Diagnostics.Process() 3 'ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定 4 p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec") 5 '出力を読み取れるようにする 6 p.StartInfo.UseShellExecute = False 7 p.StartInfo.RedirectStandardOutput = True 8 p.StartInfo.RedirectStandardInput = False 9 'ウィンドウを表示しないようにする 10 p.StartInfo.CreateNoWindow = True 11 'コマンドラインを指定("/c"は実行後閉じるために必要) 12 p.StartInfo.Arguments = "/c net use \111.222.333.444\IMG /user:test\usr1 1234" 13 '起動 14 p.Start() 15 'プロセス終了まで待機する 16 'WaitForExitはReadToEndの後である必要がある 17 '(親プロセス、子プロセスでブロック防止のため) 18 p.WaitForExit() 19 p.Close()

こちらを実行しても参照できずにいます。画面にPDFを表示させたいので、
iframeを利用したく考えております。
他の方法や、どのようにしたら閲覧クライアント側からユーザ・パスワード付のフォルダに
アクセスできるようになりますでしょうか。

どなたかご教授をお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/10/26 05:49

> クライアント側にWindowsコマンドプロンプトを実行させる そんな事ができたらウィルスをばら撒くサイトをじゃんじゃん作れますが
退会済みユーザー

退会済みユーザー

2020/10/26 06:41

前のスレッド https://teratail.com/questions/299905 の続きというか拡大で、各クライアントが持つ共有サーバーに対するアクセス権を使って、ブラウザ ⇔ Web サーバー ⇔ ファイルサーバーの共有フォルダにアクセスして、共有フォルダのファイルを閲覧したいという話ですよね?
kumakumatan

2020/10/26 07:05

ご回答ありがとうございます。はい。その通りでございます。 色々調べてみたら、シンボリックリンクを作成して、aspx側で「/シンボリックリンクフォルダ/test.pdf」 としたら参照できるようになりました。 この方法でやろうと思います。
退会済みユーザー

退会済みユーザー

2020/10/26 22:22 編集

> シンボリックリンクを作成して、aspx側で「/シンボリックリンクフォルダ/test.pdf」 としたら参照できるようになりました。 結局は IIS のワーカープロセス (静的ファイルに直リンクだと IIS の匿名ユーザーかも) がファイルサーバーのファイルを読みに行くのですが、その「シンボリックリンク」を作ることでワーカープロセス (もしくは IIS の匿名ユーザー) にアクセス権を与えることができるのか教えて下さい。できなければ、望むことはできないと思うのですが。
退会済みユーザー

退会済みユーザー

2020/10/26 22:37

もう一つ質問させてください。先の私のコメント、 > 各クライアントが持つ共有サーバーに対するアクセス権を使って・・・ に対しては YES という答えだったのですが、質問では、 > 「ユーザ:test\usr1」「パスワード:1234」 に固定で良さそうに見えます。どうなんでしょう? 固定でよければ、前のスレッドの回答で解決するはずですが?
kumakumatan

2020/10/26 23:46

ご回答ありがとうございます。 サーバ再起動したら「500 - 内部サーバー エラーです。 検索中のリソースに問題があるため、リソースを表示できません。」 となってしまいました。 ユーザ・パスワードは固定です。 もう少し調べてみます。何かいい方法があればご教授下さい。 宜しくお願いします。
退会済みユーザー

退会済みユーザー

2020/10/27 00:22

> サーバ再起動したら「500 - 内部サーバー エラーです。 再起動するだけでなく何かしたのだと思いますが、何をしたのか書いてください。問題の iframe を表示? 500 エラーということは例外がスローされたのだと思いますが、スローされた例外は何なのか調べて書いてください。
退会済みユーザー

退会済みユーザー

2020/10/27 00:25

> ユーザ・パスワードは固定です。 そうであれば、上のコメントにも書いたように、前のスレッドの回答で解決するはずですが? ワーカープロセスにアクセス権を与えることは前のスレッドの回答でできたが、静的ファイルに直リンクしたため IIS の匿名ユーザーがアクセスに行って、アクセス権がないので拒否されたということ?
kumakumatan

2020/10/27 00:29

直接ファイルを「http://~xxx.pdf」と表示させようとしても、500エラーが表示されてしまいます。Webディレクトリ認証が通ってのかと思います。 ただ再起動しただけなので、原因が不明です・・。
退会済みユーザー

退会済みユーザー

2020/10/27 00:34

Webディレクトリ認証ってなんですか? 先にも聞きましたが、スローされた例外は何なのか調べて書いてください。
退会済みユーザー

退会済みユーザー

2020/10/27 00:46

話が通じてないようです。先にも聞きましたが、スローされた例外は何なのか調べて書いてください。
kumakumatan

2020/10/27 00:48

どのように調べたらいいでしょうか? 宜しくお願いします。
退会済みユーザー

退会済みユーザー

2020/10/27 00:50

> c:\test\test1フォルダにファイルサーバのフォルダをシンボリックリンクにしました。 それでは当然ダメで、もしアクセス権の問題が無いとしても(無いわけないのですが)、それを仮想ディレクトリに設定しないと(できないと思いますが)ブラウザからはアクセスできません。 とにかく完全に迷走していてやってることがメチャクチャという感じ。一度リセットしましょう。
退会済みユーザー

退会済みユーザー

2020/10/27 01:06

web.config で customErrors 要素の mode 属性を Off にすると詳細エラー情報がブラウザに表示されます。デフォルトで RemoteOnly なので、そうなっていれば Web サーバーのブラウザでアクセスすれば詳細エラー情報が表示されます。 その中にスローされた例外が何かの情報が含まれていると思います。
退会済みユーザー

退会済みユーザー

2020/10/27 07:29

質問者さん、無言ですが、回答したのでそれに対するフィードバックを書いてください。役に立った/立たなかったぐらいはすぐ返せるのでは? 役に立たなかったなら、どこが期待する答えと違うか書いてもらえると別の案が出せるかも。とにかく無言は NG です。
kumakumatan

2020/10/27 07:34

ありがとうございます。現在調査中です。
kumakumatan

2020/10/29 00:44

ありがとうございます。解決できました。 解決方法を下記に記載しておきます。 今後とも宜しくお願いします。
退会済みユーザー

退会済みユーザー

2020/10/29 01:22

質問者さんの回答のやり方は、間違っているとまでは言いませんが、それに近いことをしています。詳しくは質問者さんの回答のコメント欄に書きましたので読んでください。
guest

回答2

0

質問のコメント欄で「一度リセットしましょう」と書きましたが、そのために整理して回答欄に書きます。

まず質問の課題、

ASP.NETにてクライアント側にWindowsコマンドプロンプトを実行させるには

ですが、その答えは「できません」です。

何があっても逆立ちしても 100% 不可能とまでは言えませんが、限りなく不可能に近い非現実的な話なので忘れた方がよさそうです。

質問者さんが考えたシンボリックリンクの話も、アクセス権の問題は解決できないようですので忘れた方がよさそうです。

「ユーザ:test\usr1」「パスワード:1234」は固定でよいとのことですので、ワーカープロセスにそのアカウントを偽装させてアクセス権を与えれば良いはずです。

それは前のスレッド https://teratail.com/questions/299905 の回答でできているはずです。試しに、問題のファイルサーバーのファイルを読むだけのコードをどこかのページの aspx.cs に実装して確認してみてください。例外がスローされず、読み取りに成功したらワーカープロセスにはアクセス権を与えることはできているはずです。

想像ですが、今回の問題は、静的ファイルに直リンクしたため IIS の匿名ユーザー IUSR(匿名認証が有効化されている場合は常に IIS によって使用される既定の ID)がアクセスに行って、アクセス権がないので拒否されたということではないかと思います。

であれば、静的ファイルを直リンクするのではなく、HTTP ハンドラなどを自作してそれ経由でファイルサーバーのファイルにアクセスして取得することを検討してはいかがですか?

投稿2020/10/27 01:29

編集2020/10/27 01:42
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

(1)ASPアプリにて「ASP.NET偽装」、「匿名認証」を有効にして、ファイルサーバのアクセス権のあるユーザ、パスワードを設定する。

(2)web.configにて「<identity impersonate="true" userName="ユーザ名" password="パスワード"/>」を追記する。

(3)Webアプリ内にファイル保管フォルダを作成して、そこのアクセス権にて「IIS_IUSRS」のアクセス権を付与する。

(4)VB側にて「System.IO.File.Copy(コピー元ファイル, コピー先ファイル, True)」にてファイルコピーする。

(5)aspx側にて「<iframe src="/ファイル格納フォルダ/xxxx.pdf"></iframe>」として読込ファイルを指定する。

(6)夜間にファイル格納フォルダ内に溜まったファイル(pdfファイル)を削除する。

として実装する事ができました。

投稿2020/10/29 00:43

kumakumatan

総合スコア213

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/10/29 01:23 編集

間違っているとまでは言えないのでマイナス評価はしませんが、それに近いことをしています。 上の回答にある (4) ができたということは、私の回答で、 > 例外がスローされず、読み取りに成功したらワーカープロセスにはアクセス権を与えることはできているはずです。 ・・・と書いた通り、アクセス権を与えることには成功しているので、 その次に書いた、 > 静的ファイルを直リンクするのではなく、HTTP ハンドラなどを自作してそれ経由でファイルサーバーのファイルにアクセスして取得することを検討してはいかがですか? ・・・の方向に進むべきです。 ファイルサーバーから Web サーバーのアプリのディレクトリにファイルをコピーしてきて夜間に消すという無駄な操作(回答の (3) ~ (6) の操作)は不要です。 ブラウザのキャッシュの問題もあって、(6) で消したつもりが、クライアントが要求をかけるとブラウザのキャッシュから取得して表示できてしまう(ファイルサーバーのファイルは更新したのにキャッシュにある古いファイルが表示される)ことにもなります。 無駄なことをしている&キャッシュの問題を認識したうえで (1) ~ (6) のやり方で良いというならお好きなようにとしか言えませんが、そこが少しでも気になるようなら HTTP ハンドラを使うことを検討してください。 具体例は以下の記事が参考になると思います。 HTTP ハンドラでキャッシュコントロール http://surferonwww.info/BlogEngine/post/2015/05/19/cache-control-by-using-http-handler.aspx
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問