Не удается удалить файл — Windows 10, проблема с разрешениями?

#windows #powershell #permissions #delete-file

#Windows #powershell #разрешения #удалить-файл

Вопрос:

Подробные сведения:

В Windows 10 версии 1909 установлен VS Code на C:Users <Имя пользователя>AppData Local Programs Microsoft VS Code

Попытка открыть VS Code завершается неудачей, попытка запустить установщик сообщает, что он не может переопределить code.exe

Система безопасности сообщает, что не может отобразить текущего владельца, и нажатие «Продолжить» приводит меня к сообщению «У вас нет разрешения на просмотр или редактирование настроек разрешений этого объекта».

Экран безопасности

Но Powershell показывает, что я единственный, у кого есть пользователь и доступ (и моя учетная запись является локальным администратором):

Powershell

Попытка удаления с помощью Powershell, похоже, выдает ошибку RemoveFileSSystemItemIOError:

Ошибка удаления файла Powershell

Будем признательны за любые идеи или помощь.

Спасибо!

Комментарии:

1. Может быть, вредоносный антивирус на картинке?

Ответ №1:

Я использую эту функцию для решения проблем с доступом к файлам или папкам, с которыми я сталкиваюсь, предполагая, что я являюсь членом группы локального администратора.

Код:

 Function PWN-Item{
[CmdletBinding()]
Param(
    [Parameter(ValueFromPipeline=$True)]
    $Path
)
Begin{
If(!$Script:PWNInit){
#P/Invoke'd C# code to enable required privileges to take ownership and make changes when NTFS permissions are lacking
$AdjustTokenPrivileges = @"
using System;
using System.Runtime.InteropServices;

 public class TokenManipulator
 {
  [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
  internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
  ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
  [DllImport("kernel32.dll", ExactSpelling = true)]
  internal static extern IntPtr GetCurrentProcess();
  [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
  internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr
  phtok);
  [DllImport("advapi32.dll", SetLastError = true)]
  internal static extern bool LookupPrivilegeValue(string host, string name,
  ref long pluid);
  [StructLayout(LayoutKind.Sequential, Pack = 1)]
  internal struct TokPriv1Luid
  {
   public int Count;
   public long Luid;
   public int Attr;
  }
  internal const int SE_PRIVILEGE_DISABLED = 0x00000000;
  internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
  internal const int TOKEN_QUERY = 0x00000008;
  internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
  public static bool AddPrivilege(string privilege)
  {
   try
   {
    bool retVal;
    TokPriv1Luid tp;
    IntPtr hproc = GetCurrentProcess();
    IntPtr htok = IntPtr.Zero;
    retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
    tp.Count = 1;
    tp.Luid = 0;
    tp.Attr = SE_PRIVILEGE_ENABLED;
    retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
    retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
    return retVal;
   }
   catch (Exception ex)
   {
    throw ex;
   }
  }
  public static bool RemovePrivilege(string privilege)
  {
   try
   {
    bool retVal;
    TokPriv1Luid tp;
    IntPtr hproc = GetCurrentProcess();
    IntPtr htok = IntPtr.Zero;
    retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
    tp.Count = 1;
    tp.Luid = 0;
    tp.Attr = SE_PRIVILEGE_DISABLED;
    retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
    retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
    return retVal;
   }
   catch (Exception ex)
   {
    throw ex;
   }
  }
 }
"@
add-type $AdjustTokenPrivileges
#Activate necessary admin privileges to make changes without NTFS perms
[void][TokenManipulator]::AddPrivilege("SeRestorePrivilege") #Necessary to set Owner Permissions
[void][TokenManipulator]::AddPrivilege("SeBackupPrivilege") #Necessary to bypass Traverse Checking
[void][TokenManipulator]::AddPrivilege("SeTakeOwnershipPrivilege") #Necessary to override FilePermissions
$Script:PWNInit = $True
}
#Obtain a copy of the initial ACL
#$FSOACL = Get-ACL $FSO - gives error when run against a folder with no admin perms or ownership

}
Process{
ForEach($Item in $Path){
$FSO = Get-Item $Item
#Create a new ACL object for the sole purpose of defining a new owner, and apply that update to the existing folder's ACL
$NewOwnerACL = If($FSO -is [System.IO.DirectoryInfo]){New-Object System.Security.AccessControl.DirectorySecurity}else{New-Object System.Security.AccessControl.FileSecurity}
#Establish the folder as owned by BUILTINAdministrators, guaranteeing the following ACL changes can be applied
$Admin = New-Object System.Security.Principal.NTAccount("BUILTINAdministrators")
$NewOwnerACL.SetOwner($Admin)
#Merge the proposed changes (new owner) into the file/folder's actual ACL
$FSO.SetAccessControl($NewOwnerACL)

#Add full control for administrators
$Rights = [System.Security.AccessControl.FileSystemRights]"FullControl" 
$InheritanceFlag = If($FSO -is [System.IO.DirectoryInfo]){[System.Security.AccessControl.InheritanceFlags]"ObjectInherit,ContainerInherit"}else{[System.Security.AccessControl.InheritanceFlags]::None}
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None 
$objType =[System.Security.AccessControl.AccessControlType]::Allow 
$objACE = New-Object System.Security.AccessControl.FileSystemAccessRule($Admin, $Rights, $InheritanceFlag, $PropagationFlag, $objType) 
#Get fresh copy of ACL
$objACL = Get-Acl $FSO.FullName
#Clear any DENY rules for the local admin group
$objACL.Access|?{$_.IdentityReference -eq $admin -and $_.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Deny}|%{$objACL.RemoveAccessRule($_)}
#Add Full Control here
$objACL.AddAccessRule($objACE)
#Set updated ACL
Set-Acl $FSO.FullName $objACL
}
}
}
  

Хорошо, название функции невзрачное, но помимо этого она работает действительно хорошо. Он запускает некоторый код на C # для настройки [TokenManipulator] класса (код, который я подобрал в Интернете, но забыл записать, откуда. Если это ваш код, пожалуйста, пришлите мне ссылку на исходный код, чтобы я мог отдать вам должное!). Это позволяет нам стать владельцем. Затем, как только мы становимся владельцами файла, мы удостоверяемся, что локальная группа администраторов имеет полный доступ и что для локальной группы администраторов нет правил запрета. Помимо этого вы должны иметь возможность делать все, что хотите, с файлом или папкой, в которой вы его запускаете.

Использование: Запустите приведенный ниже код, чтобы загрузить скрипт в свой сеанс. Затем вы можете либо вставить в него строки следующим образом:

 Get-ChildItem C:Temp |Select -Expand FullName | PWN-Item
  

Или вы можете запустить его обычным образом для строки или массива строк:

 PWN-Item 'C:Temp','C:TempMyFile.exe'
  

Комментарии:

1. Спасибо за ответ. При запуске в exe происходит сбой. Похоже, ‘ItemExistsUnauthorizedAccessError’: [![pwn-item-сбой][1]][1] [1]: imgur.com/a/IgMjNwt

2. Можете ли вы сначала запустить его в папке, где находится файл? Моим следующим предложением было бы использовать psexec.exe запустить powershell под системной учетной записью и посмотреть, повезет ли вам с этим больше.

3. Запуск его в папке завершается успешно, но запуск в exe завершается неудачей

4. Возможно, попробуйте использовать takeown.exe вместо этого? takeown /F C:Users<UserName>AppDataLocalProgramsMicrosoft VS Codecode.exe из командной строки с повышенными правами. Возможно, глупый вопрос, но вы перезагружали систему с тех пор, как у вас возникла эта проблема?

5. PS C:WINDOWSsystem32 > удаление / F ‘C:Users <Имя пользователя>AppData Local Programs Microsoft VS Codecode.exe ОШИБКА: доступ запрещен.