删除其他用户userfolder作为管理员导致访问被拒绝

时间:2014-08-28 11:03:49

标签: c# windows file-access

我写了一个工具,它应该在经过一些安全检查后删除旧用户的用户文件夹
问题是虽然我以管理员身份启动应用程序(使用UAC进行最低设置)但应用程序似乎没有足够的权限...

如果我尝试手动删除资源管理器中的文件夹,我会被要求以管理员身份执行此操作,然后单击继续(我的德语版本中的“fortsetzen”)并且它按预期工作,这证明我/我的登录确实具有必要的权利。

经过一些研究后,我创建了一个清单,并在其中包含了这一行:

<requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

我也试过这个:

<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

同样的结果:对于少数用户来说,它有效,但大多数用户没有
我用来删除的功能是:

DirectoryInfo userDir = new DirectoryInfo(usersDir + "\\" + user);
userDir.Delete(true);

这是我为两个不同用户提供的例外情况。

原文(翻译见下文):

System.UnauthorizedAccessException: Der Zugriff auf den Pfad "COPYING" wurde verweigert.
   bei System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
   bei System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
   bei System.IO.DirectoryInfo.Delete(Boolean recursive)
   bei LDAP_Search.Starter.deleteUser(String usersDir, String user)

System.IO.IOException: Der Zugriff auf den Pfad "C:\Users\lennartz\AppData\Local\Microsoft\Windows\Burn\Burn" wurde verweigert.
   bei System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
   bei System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
   bei System.IO.DirectoryInfo.Delete(Boolean recursive)
   bei LDAP_Search.Starter.deleteUser(String usersDir, String user)

由我翻译:

System.UnauthorizedAccessException: The access to the path "COPYING" has been denied.
   at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
   at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
   at System.IO.DirectoryInfo.Delete(Boolean recursive)
   at LDAP_Search.Starter.deleteUser(String usersDir, String user)

System.IO.IOException: The access to the path "C:\Users\lennartz\AppData\Local\Microsoft\Windows\Burn\Burn" has been denied.
   at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
   at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
   at System.IO.DirectoryInfo.Delete(Boolean recursive)
   at LDAP_Search.Starter.deleteUser(String usersDir, String user)

为了使其正常工作,我需要做什么? 管理员不应该够吗?
编辑:
附加信息(必要时不是舒尔):
操作系统:Windows 7 Enterprise成功加入了samba域 这是所有域用户 Userprofiles仅在本地存在 我是名为“edv”(德语相当于“IT”)的域名组的成员 该组将添加到运行我的应用程序的客户端的本地管理员组中
编辑:
发布于superuser.com here

解决了感谢superz.com上的lzam
Sollution:
我必须做以下事情:

  1. 取得所有权
  2. 设置权利
  3. 删除写保护标志
  4. 删除它
  5. 代码:

    SecurityIdentifier cu = WindowsIdentity.GetCurrent().User;
    var fileS = Directory.GetAccessControl(dir.FullName);
    fileS.SetOwner(cu);
    fileS.SetAccessRule(new FileSystemAccessRule(cu, FileSystemRights.FullControl, AccessControlType.Allow));
    Directory.SetAccessControl(dir.FullName, fileS);
    File.SetAttributes(dir.FullName, FileAttributes.Normal);
    

    对于文件:

    SecurityIdentifier cu = WindowsIdentity.GetCurrent().User;
    var fileS = File.GetAccessControl(dir.FullName);
    fileS.SetOwner(cu);
    fileS.SetAccessRule(new FileSystemAccessRule(cu, FileSystemRights.FullControl, AccessControlType.Allow));
    File.SetAccessControl(dir.FullName, fileS);
    File.SetAttributes(dir.FullName, FileAttributes.Normal);
    

    我必须递归地为所有文件和目录执行此操作,然后才能删除它们。

0 个答案:

没有答案