おまけ:NTFS クォータエントリを設定するコード


現在、Tech days 2010 の準備と並行して、IIS TechCenter 向けに和訳された IIS.NET ドキュメントの監修作業を行っています。

そこで WMI でなく、DiskQuotaTypeLibrary (dskquota.dll) を使用したサンプルコードの載ったページを見つけたので、一足早く紹介させていただきます。

ココです↓

Provisioning Sample in C#
http://learn.iis.net/page.aspx/285/provisioning-sample-in-c/

ただ一つ、非常に残念なことには、ここに掲載されているクォータのサンプルコード、AddUserDiskQuota メソッドは動作しません…Orz。

なぜなら DiskQuotaControlClass のインスタンスを取得するのに使用している GetDiskQuotaControl メソッドは DiskQuotaTypeLibrary に無いからです。

この GetDiskQuotaControl メソッドがこの地球上にどこかに本当に存在するか否かは別として、以下のようにインスタンスを取得するように記述しなおすことで、このサンプルコードは正常に動作するようになります。

DiskQuotaControlClass diskQuotaCtrl = GetDiskQuotaControl(diskVolume);
↓ 以下のように変更

DiskQuotaControlClass diskQuotaCtrl = new DiskQuotaControlClass();
diskQuotaCtrl.Initialize(diskVolume, true);

修正した AddUserDiskQuota メソッドの全体のコードは以下の通りです。

using DiskQuotaTypeLibrary; //windows\system32\dskquota.dll を参照設定

public static bool AddUserDiskQuota(string userName, double quota, double quotaThreshold, string diskVolume)
{
    try
    {
        DiskQuotaControlClass diskQuotaCtrl = new DiskQuotaControlClass();
        diskQuotaCtrl.Initialize(diskVolume, true);  
        diskQuotaCtrl.UserNameResolution = UserNameResolutionConstants.dqResolveNone;
        DIDiskQuotaUser diskUser = diskQuotaCtrl.AddUser(userName);
        diskUser.QuotaLimit = quota;
        diskUser.QuotaThreshold = quotaThreshold;
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message, ex);
    }
    return true;
}

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

//引数:ログオンユーザーアカウント,クォータサイズ,警告を出すサイズ,ドライブ
AddUserDiskQuota(@"myPC\user01",1024*100,(1024*100)*0.8,@"C:\");

調子に乗ってクォータエントリを削除するコードも作ってみました。

//クォータエントリを削除

//引数:ログオンユーザー ID, ドライブ
public static bool DeleteUserDiskQuota(string userName, string diskVolume)
{
    try
    {
        DiskQuotaControlClass diskQuotaCtrl = new DiskQuotaControlClass();
        diskQuotaCtrl.Initialize(diskVolume, true); 
        DIDiskQuotaUser diskUser = diskQuotaCtrl.FindUser(userName);
        diskQuotaCtrl.DeleteUser(diskUser);   
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message, ex);
    }
    return true;
}

この NTFS クォータが提供する DiskQuotaTypeLibrary については、MSDN Library を探してみましたがリファレンスを見つけることはできませんでした。

しかし、公開されているオブジェクトやメソッドは Visual Studio のオブジェクトビューアで確認できるので、その他の機能を実装したい方はそれと野生の勘を頼りにがんばってください。(私もそうしました)

機会があれば DiskQuotaTypeLibrary に関するその他のサンプルコードも書きたいと思います。

ではまた。

(いいかげん、Tech Days のスライドを作らないと、、)

Real Time Analytics

Clicky

Comments (0)

Skip to main content