Condividi tramite


コードによるファイルスクリーン機能の実装

以前のブログの記事で公開しました IIS7.x での共有 Web ホスティングのためのサンプルアプリケーション について、以下の機能を追加予定でいます。

1. ディスククォータの制御
2. ファイルスクリーン機能の実装
3. データベースとデータベースの管理ユーザー作成

今回はファイルスクリーン機能をどのように実装するかについて書きたいと思います。

さて、その前にファイルスクリーンについて簡単に説明しておきましょう。

ファイルスクリーンとは

ここで述べるファイルスクリーンとは、ディスクに配置されるファイルを選別 (screening) する機能です。

具体的には、ファイル名や拡張子により、ファイル種別を判別し、コピーを許可するか拒否するか、はたまた監視用にログに記録だけを残すかを指定することができます。

つまり、ユーザーにアップロードしてほしくないファイルがある場合は、コピーされないようにしたり、またはログだけを残して後で、うへへぇ~、とか言いながら (べつに言わなくてもいいですけど) 内容を確認するといったことができるのです。

ところで、アップロードされたくないファイルというのはどういうものがあるでしょう?

たとえば、自分が Web サイトの共有サービスを運営していたとして、ユーザーの Web サイトに実行ファイルや、オーディオファイル、動画ファイルが山ほどアップロードされていたら、なんかドキドキしませんでしょうか?

実行ファイルは凶悪なウィルスかもしれませんし、違法コピーされたソフトウェアかもしれません。マルチメディアファイルは著作権やら公序良俗などに反しているかもしれません。

とくにマルチメディアファイルは内容のいかんにかかわらず、プログレッシブダウンロードで配信をされるとネットワークの帯域を圧迫する可能性があります。(※ IIS7.x には、プログレッシブダウンロード時の帯域を制御を可能するビットレートスロットリング モジュールが用意されており、 IIS.NET より入手して使用することができます。『Bit Rate Throttling』:https://www.iis.net/expand/bitratethrottling)

そういった場合にファイルスクリーンの機能を使用して、これらのファイルのアップロードを拒否することが可能です。

この機能は、Windows Server 2008 に搭載されている ファイルサーバー リソース マネージャー (FSRM) の機能を使用することで実現することができます。

FSRM を使用した手動でのファイルスクリーンの方法については、お手数ですが以下のリンクの内容をご参照ください。

FSRM - 『ファイルスクリーンの管理
https://technet.microsoft.com/ja-jp/library/cc732074.aspx

FTP 7.5 と組み合わせた手動での設定手順はクォーターを設定するのと同様です。以下のドキュメントは、FTP 7.5 に FSRM のフォルダクォータを設定する具体的手順を示したものですが、基本的な作業は一緒ですのでご覧ください。

FTP での FSRM フォルダー クォータの使用
https://technet.microsoft.com/ja-jp/library/dd939104.aspx 

 

コードによるファイルスクリーンの実装

コードから FSRM のファイルスクリーン機能を使用するには、フォルダークォータの実装と同じく FSRM の API を使用します。

具体的にはここらへん ↓ のドキュメントをもとにコードを書いていきます。

FSRM Reference
https://msdn.microsoft.com/en-us/library/bb625489(VS.85).aspx 

Using Templates to Define File Screens
https://msdn.microsoft.com/en-us/library/bb870629(VS.85).aspx 

相変わらず C++ によるワイルドすぎるサンプルコードしか用意されていませんので、"プロビジョニング用サンプルコード" 用に C# で書き直します。

以下が、私のつたない知識で書き直し、メソッドの形にした C# コードです。公開されているマネージコードのサンプルがないので、正しいかどうかは ??? ですが、手元の環境ではちゃんと動作を確認してあります。

※) c:\windows\system32\srm.dll を参照設定してください。

using FsrmLib;

//ファイルスクリーンの情報を取り出すためのクラス public class FileScreenInfo {    public string Path;    public string Description;    public string TemplateName;    public int FileScreenFlags; }

//テンプレートによるファイルスクリーンの設定 public static void AddFileScreen(string folderPath, string templateName, string description) {      FsrmFileScreenManager screenMgr = new FsrmFileScreenManager();      IFsrmFileScreen fileScreen = screenMgr.CreateFileScreen(folderPath);      fileScreen.ApplyTemplate(templateName);      fileScreen.Description = description;      fileScreen.Commit(); }

//ファイルスクリーンの削除 public static void DeleteFileScreen(string folderPath) {      FsrmFileScreenManager screenMgr = new FsrmFileScreenManager();      IFsrmFileScreen fileScreen = screenMgr.GetFileScreen(folderPath);      fileScreen.Delete();      fileScreen.Commit(); }

//ファイルスクリーンの情報を取得 public FileScreenInfo GetFileScreenInfo(string folderPath) {      FileScreenInfo screenInfo = new FileScreenInfo();      FsrmFileScreenManager screenMgr = new FsrmFileScreenManager();      IFsrmFileScreen fileScreen = screenMgr.GetFileScreen(folderPath);      screenInfo.Path = fileScreen.Path;      screenInfo.Description = fileScreen.Description;      screenInfo.TemplateName = fileScreen.SourceTemplateName;      screenInfo.FileScreenFlags = fileScreen.FileScreenFlags;

     return screenInfo; }

呼び出し方は以下のようにします。

 //テンプレート "オーディオとビデオのファイルのブロック" を使用してファイルスクリーンを適用AddFileScreen(@"C:\work\demo\quota", "オーディオとビデオのファイルのブロック", "プログラムからのファイルスクリーンの設定");//ファイルスクリーンの削除DeleteFileScreen(@"C:\work\demo\quota");//ファイルスクリーンの情報を表示DiskQuotaInfo quotaInfo = GetDiskQuotaInfo(@"C:\work\demo\quota");         string outString = "クォータのパス : " + quotaInfo.Path + "\n"             + "設定値 :" + quotaInfo.Limit.ToString() + "\n"             + "使用サイズ :" + quotaInfo.Used.ToString() + "\n"             + "説明 :" + quotaInfo.Description + "\n"             + "テンプレート :" + quotaInfo.TemplateName + "\n"             + "実行フラグ :" + quotaInfo.QuotaFlags.ToString() + "\n"             + "ピーク時のサイズ :" + quotaInfo.PeakUsage + "\n"             + "ピークの時間 :" + quotaInfo.PeakUsageTime;         MessageBox.Show(outString);  

今回のコードでは、あらかじめ定義してあるテンプレートを指定してファイルスクリーンを適用していますが、FSRM の API を使用してファイルグループを動的に作成することも可能です。

ただし、ファイルグループや、ファイルスクリーンの振る舞いに対して、毎回細かなパラメーター設定して作成するというのは、どうも現実的ではないような気がします。(実は、途中までサンプルコードを作成したのですが、コードのステップ数が恐ろしく必要なわりには使用される状況が少ないような気がしたので途中で断念しました。非常にだんねんです。)

ファイルスクリーンに独自の振る舞いを定義する際には、FSRM の UI を使用してあらかじめテンプレートを作成しておき、それをコードから使用するようにするのが良いでしょう。

ではまた。

Real Time Analytics

Clicky