コードによるディスククォータの設定


先日のブログの記事で、IIS7.x Web サイト共有ホスティングサービスのための、プロビジョニング用のサンプルアプリケーションを公開させていただきましたが、早速アップデートの準備を進めています。


次のアップデートでは、以下の機能の追加を予定しております。


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


その中から、今回はディスク クォータの制御をどのように実装するかについて書きたいと思います。


Windows Server の 2 種類のクォータ機能


Windows におけるディスク クォータの機能は、Windows 2000 で NTFS ディスク クォータが初めて搭載され、Windows Server 2003 R2 からは、ファイルサーバー リソース マネージャー (FSRM) が提供する、記憶域によるクォータ機能が追加されました。


この二つのクォータの機能の違いはなにかというと、NTFS ディスク クォータは、ユーザーアカウント、セキュリティグループに対しディスクの使用量を制御するのに対し、 FRMS が提供するクォータの機能は、フォルダごと、ドライブごとに、個別に使用量を設定することができます。


ちなみに前者の NTFS ディスククォータは、Windows XP,Vista, 7 などのクライアント OS にも付属していますが、FSRM はサーバー OS のみに付属します。


この 2 つのディスククォータの具体的な使用方法については、以下のドキュメントをご参照ください。


[HOWTO] Windows Server 2003 のディスククォータを使用してディスク容量とディスクの使用を管理する方法』


http://support.microsoft.com/kb/326212/ja


() Windows Server 2003 について書かれていますが、Windows Server 2008 でも同様です。


 


 FSRM - 『ファイルサーバー リソース マネージャ』
http://www.microsoft.com/japan/technet/windowsserver/2008/library/c203b256-30c5-426b-9e33-9d108256097e.mspx?mfr=true


<補足 : ファイルサーバー リソース マネージャのインストールについて>
Windows Web Server 2008 では、サーバーマネージャーの [機能] 画面の [機能の追加]から直接セットアップできますが、Standard 以上のエディションでは [役割] で "ファイルサービス" を追加する必要があります。ファイルサーバー リソース マネージャは 役割 ファイルサービスの機能の一部です。


 



プログラムによるディスククォータの設定

さて、今回のプロビジョニング用サンプルアプリケーションに追加するディスククォータ機能なのですが、今回は FRMS のものを実装します。

理由としては、サンプルアプリケーションが作成する IIS 管理ユーザーアカウントは、Windows 上のユーザーアカウントでないため、NTFS ディスククォータでは細かな制御ができないためです。 


そんなわけで、ここでは NTFS ディスククォータ制御のためのコードは、詳しく紹介しくませんが、いちおう サンプルコードが記述されたドキュメントを紹介させていただきます。サンプルコードは vbs で記述されておりますが、WMI を使用したものなので、適宜目的の言語で書き直していただければと思います。


『Windows Server 2003 と Windows XP におけるディスク クォータ管理』
http://www.microsoft.com/japan/technet/scriptcenter/topics/win2003/quotas.mspx


NTFS のディスククォータについては、上記のような、詳しいうえウィットに富んだジョークまで入った素敵なドキュメントが用意されておりますが、FRMS が提供するディスククォータについても以下のように親切なサンプルコードが用意されています。


ただし、"野生的"という言葉があまりにも似合いすぎる C++ コードで記述されていますが....。


『Limiting the Amount of Data Written to a Directory』
http://msdn.microsoft.com/en-us/library/bb870630(VS.85).aspx


プロビジョニング用のサンプルアプリケーションは C# で書いていますので、当然のことながらこのままサンプルコードは使用することはできません。


ということで、猛々しく雄雄しい、野生の猛獣のような C++ コードを、フレンドリでチャーミングな、お茶の間の子猫ちゃんのような C# に書き換えてみました。


公開されているマネージコードのサンプルがないので、正しいかどうかは ??? ですが、ちゃんと動作を確認してあります。







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


using FsrmLib;


//クォータの情報を取り出す際に使用するクラス
public class DiskQuotaInfo
{
  public string Path;
  public double Limit;
  public double Used;
  public double PeakUsage;
  public DateTime PeakUsageTime;
  public string Description;
  public string TemplateName;
  public int QuotaFlags;
}



//サイズによるディスククォータの指定
public static void AddDiskQuota(string folderPath, double quotaSize, string description)
{
  FsrmQuotaManager quotaMgr = new FsrmQuotaManager();
  IFsrmQuota quotaDef = quotaMgr.CreateQuota(folderPath);
  quotaDef.QuotaLimit = quotaSize;
  quotaDef.Description = description;
  quotaDef.Commit();
}


 //テンプレートによるディスククォータの指定
public static void AddDiskQuota(string folderPath, string templateName, string description)
{
  FsrmQuotaManager quotaMgr = new FsrmQuotaManager();
  IFsrmQuota quotaDef = quotaMgr.CreateQuota(folderPath);
  quotaDef.ApplyTemplate(templateName);
  quotaDef.Description = description;
  quotaDef.Commit();
}



//クォータの情報を取得
public static DiskQuotaInfo GetDiskQuotaInfo(string Folder)
{
  DiskQuotaInfo quotaInfo = new DiskQuotaInfo();
  FsrmQuotaManager quotaMgr = new FsrmQuotaManager();
  IFsrmQuota quotaDef = quotaMgr.GetQuota(Folder);
  if (quotaDef != null)
  {
    quotaInfo.Path = quotaDef.Path;
    quotaInfo.Description = quotaDef.Description;
    quotaInfo.Limit = Convert.ToDouble(quotaDef.QuotaLimit);
    quotaInfo.Used = Convert.ToDouble(quotaDef.QuotaUsed);
    quotaInfo.PeakUsageTime = quotaDef.QuotaPeakUsageTime;
    quotaInfo.TemplateName = quotaDef.SourceTemplateName;
    quotaInfo.QuotaFlags = quotaDef.QuotaFlags;
    return quotaInfo;
  }
  else
    return null;
}


//クォータの削除
public static void DeleteDiskQuota(string folderPath)
{
  FsrmQuotaManager quotaMgr = new FsrmQuotaManager();
  IFsrmQuota quotaDef = quotaMgr.GetQuota(folderPath);
  quotaDef.Delete();
  quotaDef.Commit(); 
}


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







//目的のフォルダに 100MB のクォータを設定
AddDiskQuota(@"C:\work\demo\quota", 100 * (1024 * 1024), "プログラムからのクォータ設定");


//目的のフォルダにテンプレートを使用してクォータを設定
AddDiskQuota(@"C:\work\demo\quota", "200 MB 制限 (50 MB の拡張あり)", "プログラムからのクォータ設定");


//クォータの情報をメッセージボックスに表示
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);



//ディスククォータの削除
DeleteDiskQuota(@"C:\work\demo\quota");


 


念のために、このコードを検証すめための注意点を書いておきますと、このコードはファイルサーバーリソースマネージャー(FSRM) の API をコールしますので、あらかじめ Windows Server 2008 に同機能をインストールしておいてください。


あと、今回使用している FSRM のライブラリは COM なので、vbs や、VB とかからでも使用できます。 


次回はファイルスクリーンの設定について書きます。


では。


 


Real Time Analytics

Clicky

Comments (0)

Skip to main content