8

ファイルの所有権を取得し、C# 経由で削除しようとしています。ファイルは iexplorer.exe で、デフォルトで現在の所有者 - TrustedInstaller です。メソッド FileSecurity.SetOwner は、指定された所有権を設定しているように見えますが、実際には初期所有者を変更せず、例外もスローしません。明らかに、次にファイルを削除しようとすると、例外がスローされます。ファイルの所有権を取得して削除するには、コードで何を変更する必要がありますか?

var fileS = File.GetAccessControl(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe");
fileS.SetOwner(new System.Security.Principal.NTAccount(Environment.UserDomainName, Environment.UserName));
File.Delete(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe");
4

4 に答える 4

6

明示的に有効にする必要がありますSeTakeOwnershipPrivilege:

任意のアクセス権を付与されずにオブジェクトの所有権を取得する必要があります。この権限により、所有者の値は、所有者がオブジェクトの所有者として正当に割り当てることができる値にのみ設定できます。ユーザー権利: ファイルまたはその他のオブジェクトの所有権を取得します。

Mark Novak によって書かれた素晴らしい記事: Manipulate Privileges in Managed Code Reliably, Securely, and Efficientlyを読むことをお勧めします。

そして/または彼のサンプルを見てください。

アップデート

使用例:

var fileS = File.GetAccessControl(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe");

Privilege p;
bool ownerChanged = false;
try
{
    p = new Privilege(Privilege.TakeOwnership);
    p.Enable();

    fileS.SetOwner(new System.Security.Principal.NTAccount(
        Environment.UserDomainName, Environment.UserName));

    ownerChanged = true;
}
catch(PrivilegeNotHeldException e)
{
   // privilege not held
   // TODO: show an error message, write logs, etc.
}
finally
{
    p.Revert();
}

if (ownerChanged)
    File.Delete(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe");
于 2012-10-21T16:06:40.737 に答える
4
        string filepath = @"C:\Program Files (x86)\Internet Explorer\iexplore.exe";

        //Get Currently Applied Access Control
        FileSecurity fileS = File.GetAccessControl(filepath);

        //Update it, Grant Current User Full Control
        SecurityIdentifier cu = WindowsIdentity.GetCurrent().User;
        fileS.SetOwner(cu);
        fileS.SetAccessRule(new FileSystemAccessRule(cu, FileSystemRights.FullControl, AccessControlType.Allow));

        //Update the Access Control on the File
        File.SetAccessControl(filepath, fileS);

        //Delete the file
        File.Delete(filepath);

次のインポートを追加します

        using System.IO;
        using System.Security.AccessControl;
        using System.Security.Principal;

コードを昇格モードで実行します。

于 2013-11-06T16:12:53.967 に答える
0

コンテキスト メニューを追加するには、これらのレジストリ エントリを参照してください。Windows 7 では、フォルダーの名前と iexplorer_OFF.exe の名前を変更できました。おそらく、コードから同じものをシェル/実行できます。

https://www.howtogeek.com/howto/windows-vista/add-take-ownership-to-explorer-right-click-menu-in-vista/

于 2020-03-15T13:44:12.770 に答える