将 运行 用户设置为文件所有者并在 .NET Core 中将其删除
Set running user as file owner and delete it in .NET Core
我制作了文件清理器 Windows 服务(使用 .NET Core 3 Worker Service hosted in a Windows Service)。我将服务设置为 运行 作为具有完全访问权限的管理员。
现在我有两个 IIS 网站 运行分别由 IIS APP POOL\foo
和 IIS APP POOL\bar
用户创建。每个站点都有自己的 C:\web\foo\Uploads\
和 C:\web\bar\Uploads\
文件夹,我希望我的文件清理器定期删除它们。
即使我为 Administrator
的 Uploads
文件夹设置了完全控制权限,foo
和 bar
新创建的文件仍然无法被管理员删除。我可以手动更改这些文件夹中文件的所有者,然后删除它们(有趣的是,在文件资源管理器中,我可以毫无问题地删除它们),但我不知道如何以编程方式执行此操作。
鉴于我可以对我的 运行ning 应用程序授予任何权限,我如何才能对帐户 运行ning 设置 folder/file owner/full 控件,然后删除它?
感谢 Heretic Monkey 和各种 Whosebug post 的信息,我编译了设置 file/folder 所有者和重置其属性(即只读,系统)的解决方案:
public static class CoreUtils
{
public static string RunningUser { get; } = $"{Environment.UserDomainName}\{Environment.UserName}";
public static NTAccount RunningAccount { get; } = new NTAccount(Environment.UserDomainName, Environment.UserName);
}
void SetOwner(FileInfo file)
{
var acl = file.GetAccessControl(System.Security.AccessControl.AccessControlSections.All);
acl.SetOwner(CoreUtils.RunningAccount);
acl.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule(
CoreUtils.RunningUser, System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));
file.SetAccessControl(acl);
}
另请注意,如链接文章中所述,API 不支持长文件名,因此如果您的应用需要使用这些文件,则需要额外处理。
我制作了文件清理器 Windows 服务(使用 .NET Core 3 Worker Service hosted in a Windows Service)。我将服务设置为 运行 作为具有完全访问权限的管理员。
现在我有两个 IIS 网站 运行分别由 IIS APP POOL\foo
和 IIS APP POOL\bar
用户创建。每个站点都有自己的 C:\web\foo\Uploads\
和 C:\web\bar\Uploads\
文件夹,我希望我的文件清理器定期删除它们。
即使我为 Administrator
的 Uploads
文件夹设置了完全控制权限,foo
和 bar
新创建的文件仍然无法被管理员删除。我可以手动更改这些文件夹中文件的所有者,然后删除它们(有趣的是,在文件资源管理器中,我可以毫无问题地删除它们),但我不知道如何以编程方式执行此操作。
鉴于我可以对我的 运行ning 应用程序授予任何权限,我如何才能对帐户 运行ning 设置 folder/file owner/full 控件,然后删除它?
感谢 Heretic Monkey
public static class CoreUtils
{
public static string RunningUser { get; } = $"{Environment.UserDomainName}\{Environment.UserName}";
public static NTAccount RunningAccount { get; } = new NTAccount(Environment.UserDomainName, Environment.UserName);
}
void SetOwner(FileInfo file)
{
var acl = file.GetAccessControl(System.Security.AccessControl.AccessControlSections.All);
acl.SetOwner(CoreUtils.RunningAccount);
acl.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule(
CoreUtils.RunningUser, System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow));
file.SetAccessControl(acl);
}
另请注意,如链接文章中所述,API 不支持长文件名,因此如果您的应用需要使用这些文件,则需要额外处理。