ZAKO-PG

こんなザコがプログラマーなの?

JavaScriptでローカルファイル・フォルダを開く

前回はC#で外部アプリケーションを実行する方法を模索していましたが、今回はJavaScriptでローカルファイル・フォルダを開く方法を考えていきます。

ActiveXObjectを使う

ググってまず出てくるのはActiveXObjectを使用する方法です。
Microsoft拡張機能なので、ExcelやらWordやらを開くことができます。

使う前にインターネットオプション > セキュリティ から以下のオプションを有効にする必要があります。
これはデフォルトで無効なので、ユーザーに設定させるのはハードルが高そうですね。

  • ActiveX コントロールとプラグインの実行
  • スクリプトを実行しても安全だとマークされている ActiveX コントロールのスクリプトの実行

さらに、なんとActiveXObjectはInternetExplore限定機能でした・・・。
このご時世にWebで「IEのみサポートで~~~すwww」なんて言ったらハチの巣にされますので、この案はなし!!!

file://を使う

結局なんでも使えるのがいいよね^^ということで、file://を使うことになりそうです。

こちらもまあ一癖ありますが、とりあえずIE、Edge、FireFoxはローカルのフォルダ・ファイルを開いてくれたのでOK。
ただしChromeだけ、フォルダはページ内でリスト表示、ファイルはダウンロードされたので、挙動が若干違うようです。

また、Safariはfile://で指定すればFinderは開くものの、求めているフォルダとは違うフォルダが表示されたりするので、あまり使えなさそうでした。
MacユーザーはChrome or FireFox使ってね!になりそう。

まとめ

file://を使えばとりあえずファイル・フォルダは開けはしますが、悪意のある攻撃をうけて改竄され、ウイルス入りファイルを実行されたら目も当てられないです。

今回、業務アプリでガッチガチにアクセス制限をしているサーバーだったので、ギリ大丈夫という判断になりましたが、そうでない方は開くパスの値を検査したり、結構厳しめにしたほうがいいかもしれません。

C#で外部アプリケーションを実行する

ビビっちゃうくらい更新してなくて申し訳ございませんでした……。

仕事が忙しかったり、そもそも大したコード書いてなかったりして、ブログに書くことがなかったです^^;

ブログタイトルにもなっているように、雑魚プログラマーですので、今回も大したことないことを書いていきます!

そもそもなぜ外部アプリを実行?

そもそも論、なんで外部アプリを実行するか?という仕様ですが、

なんでもボタンをポチッとクリックして、指定パスをエクスプローラーで開きたいとのことでした。

それ必要か……?と思いますが、まあ私たち雑魚プログラマーは反論するすべがありませんので、顧客のために粛々と実装をしていきます。

様々なアプリに対応するには

今回はWindowsユーザーしかいませんが、とはいえアプリは多種多様です。

テキストファイル、PDF、Excel、Word…etc

これらをすべてswitchで分けるのはあほらしいので、コマンドプロンプトのstartにすべての願いを託しました!

startで実行すれば、各ユーザーのデフォルトアプリで開いてくれます。
例えばWebページを指定した場合、ブラウザのデフォルトアプリによっては、あるユーザーはEdge、別のユーザーChromeで開くようになります。

また、switchで大量に分けてコード量を増やすよりも、コマンドプロンプト>startの方がスッキリします。

ちなみに、/c startで実行すると、実行後にコマンドプロンプトが閉じてくれます。これでユーザーには黒い画面を見せずにアプリが開くというわけです。

C#で外部アプリケーションを実行する

using System; 
using System.Windows.Forms; 
namespace WindowsFormsApp 
{
	public partial class Form1 : Form 
	{ 
		public Form1() 
		{ 
			InitializeComponent(); 
		} 
		
		private void button1_Click(object sender, EventArgs e) 
		{
			ProcessStartInfo process = new ProcessStartInfo(); 
			//ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
			process.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
			//ウィンドウを表示しないようにする
			process.StartInfo.CreateNoWindow = true;
			//コマンドラインを指定("/c"は実行後閉じるために必要)
			process.StartInfo.Arguments = @"/c start D:\Temp\test.txt"; 

			//起動
			process.Start();
			//今回は開くだけOKなのですぐ破棄
			process.Dispose(); 
		} 
	} 
} 

まとめ

コードよりも仕様で苦しめられたケースでした。

書いてしまえば簡単ですが、私のようなへっぽこプログラマーにとっては考え付くのに時間がかかりましたね…。

こんな感じでカスプログラマーの奮闘記を今後も書いていきたいと思いますので、同じく底辺プログラマーの方は参考にしていってください^^;

.NET(C#)でデジタル署名をするには?コードで解説!

f:id:cookie11109:20180814102831p:plain
前回こんな記事を書いてました。

zako-pg.hatenablog.com


公開鍵で暗号化した後、RSACryptoServiceProvider.Encrypt()を使って秘密鍵で復号したかったのですが、この件で断念しました。

ただデジタル署名はしないといけなかったので、今回RSACryptoServiceProvider.SignHash()ででデジタル署名することにしました。

続きを読む