关于我正在完成的工作,我作为Autodesk的安装技术工作,我认为创建一个简单的程序来帮助自动清除通常在软件卸载后留下的文件夹的过程会很有趣。
我试图删除的目录如下。
C:\ProgramData\FLEXnet
C:\Program Files\Autodesk\
C:\ProgramData\Autodesk\
C:\Program Files (x86)\Autodesk\
C:\Users\All Users\Autodesk\
C:\Users\**YOUR USERID**\AppData\Roaming\Autodesk\
C:\Users\**YOUR USERID**\AppData\Local\Autodesk\这是我一直在玩的代码
private void btn_start_Click(object sender, EventArgs e)
{
//di.Attributes &= ~FileAttributes.ReadOnly;
try
{
File.SetAttributes("C:/Program Files (x86)/Autodesk", FileAttributes.Normal);
Directory.Delete("C:/Program Files (x86)/Autodesk", true);
}
catch (IOException ex)
{
MessageBox.Show(ex.Message);
}
try
{
File.SetAttributes("C:/ProgramData/Autodesk", FileAttributes.Normal);
Directory.Delete("C:/ProgramData/Autodesk", true);
}
catch (IOException ex)
{
MessageBox.Show(ex.Message);
}对于下一行,它将得到此错误。
File.SetAttributes("C:/Program Files (x86)/Autodesk", FileAttributes.Normal);System.UnauthorizedAccessException:‘访问路径'C:\Program (x86)\Autodesk’被拒绝。
如果我在哪里删除这一行并自己使用Directoyr.Delete,我就会得到这个错误。
System.UnauthorizedAccessException: 'Access to the path 'AcIPC_2_x86.dll' is denied.'我花了几天的时间试图找出如何允许软件删除目录的能力,但我觉得自己陷入了僵局。
发布于 2017-06-02 22:52:38
尝试以管理员身份通过代码运行应用程序,可能值得一试:
向项目文件夹中添加一个新项,并将其命名为“应用程序报表文件”。然后procceed将这行代码<requestedExecutionLevel>更改为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />这将提示用户允许管理员访问(因此本质上与右键单击它并单击run作为管理员相同)。
发布于 2017-06-03 00:05:12
我不知道这是不是适合你的地方。可以通过编程方式获得ACCESS_DENIED的原因是有原因的。请记住,除非您是管理员,否则不能从各种目录(包括程序和程序(x86) )中删除文件或文件夹。正如fluffy所说,您可以显式地作为管理员运行(如果是管理员),因为应用程序的自然状态是不提升的。下面是我如何克服这个问题的一个例子:
public static class FileSystem
{
public static void RunAsAdministrator(this Process process,
string arguments = "")
{
if (process == null)
{
throw new ArgumentNullException(nameof(process));
}
ProcessStartInfo startInfo = new
ProcessStartInfo(process.MainModule.FileName)
{
Verb = @"runas",
Arguments = arguments
};
Process.Start(startInfo);
public static void TakeOwnership(string path)
{
if (AppDomain.CurrentDomain.IsAdministrator())
{
using (new PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership))
{
DirectoryInfo directoryInfo = new DirectoryInfo(path);
DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();
if (directorySecurity == null)
{
return;
}
directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User);
Directory.SetAccessControl(path, directorySecurity);
}
}
else
{
Process.GetCurrentProcess().RunAsAdministrator();
}
}
}
public static bool IsAdministrator(this AppDomain threadDomain)
{
threadDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal currentPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal;
if (currentPrincipal.IsInRole(WindowsBuiltInRole.Administrator) || currentPrincipal.IsInRole((int) WellKnownSidType.AccountDomainAdminsSid))
{
return true;
}
using (WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent())
{
return windowsIdentity.Groups?.Any(windowsIdentityGroup => windowsIdentityGroup.Value.Equals(@"S-1-5-32-544")
|| windowsIdentityGroup.Value.EndsWith(@"500")
|| windowsIdentityGroup.Value.EndsWith(@"512")) == true;
}
}}如果您已经以管理员身份运行,则可以立即获得该目录的所有权,否则,将有代码包含以提升模式重新启动当前进程。
我提醒你,这样做是你自己的风险。拥有所有权是一件大事。另一种选择是采用一种不那么简单的方法,修改目录或文件上的ACL。
无论怎样,PrivilegeEnabler代码都是有用的。可以找到这里。
https://stackoverflow.com/questions/44337472
复制相似问题