Windows Server で IIS を使用して、保存したファイルの所有者を変更する方法はありますか。簡単なほど良い。ファイルが既にディスクに保存された後、保存中またはファイル所有者の変更中にこれを行う必要があるかどうかは問題ではありません。ASP.NET の例は非常に重要です。
3 に答える
理論的には、それはかなり簡単なはずです。既存のファイルの所有権を変更するには、次のようなことができるはずです。
string domain = "domain";
string user = "username";
FileInfo info = new FileInfo(@"c:\test.txt");
FileSecurity security = info.GetAccessControl();
System.Security.Principal.NTAccount newOwner =
new System.Security.Principal.NTAccount(domain, user);
security.AddAccessRule(
new FileSystemAccessRule(newOwner, FileSystemRights.FullControl,
AccessControlType.Allow));
security.SetAccessRuleProtection(true, false);
security.SetOwner(newOwner);
info.SetAccessControl(security);
ただし、実際には、Windowsが課す制限のため、これは実際には機能しません。Windowsでは、ファイルの所有者を現在のユーザーまたは管理者グループ以外に変更することはできません。
最後の行に到達すると、「セキュリティ識別子がこのオブジェクトの所有者になることは許可されていません」という例外が発生します。
グーグルは、この問題を回避できる可能性があることを示唆していますが、過去に試したときに回避策を機能させることができませんでした。誰かが回避策を成功裏に達成したかどうか聞いて非常に興味があります。
他のユーザーがファイルとディレクトリの復元権限を持っている場合、そのユーザーは所有権を他のユーザーに割り当てることができます。これはデフォルトで無効になっているため、所有者を設定する前に有効にする必要があります。.Netにはこれに対するサポートが組み込まれていないため、AdjustTokenPrivilegesをPInvokeし、他のアンマネージ関数を使用してこれへの入力を取得する必要があります。
その使用法の詳細な説明をブログに書きました
これはカスタマイズされた例ではありませんが、答えは System.Security.AccessControl名前空間にあると思います。
ルールとパーミッションを識別できる FileSecurity クラスを見てください。FileSecurity クラスは、File.Create() などのメソッドで使用されます。