
После изменения владельца исполняемых файлов в каталоге Windows ( explorer.exe
, regedit.exe
, и т.д.) я не могу вернуться к TrustedInstaller
использованию icacls.exe
. Используя метод GUI (Свойства → Безопасность → Дополнительно → Владелец) хотя работает отлично.
Делаем то же самое с любым другим файлом в Windows, т.е.нетисполняемый файл, работает отлично. Пробовал то же самое в безопасном режиме, безуспешно.
Вот две основные команды, которые я использую:
takeown /F C:\Windows\explorer.exe /A
icacls C:\Windows\explorer.exe /setowner "NT SERVICE\TrustedInstaller"
Редактировать: Забыл упомянуть, что получаю сообщение об ошибке «Доступ запрещен».
C:\Windows\System32>takeown /F c:\Windows\explorer.exe /A
SUCCESS: The file (or folder): "c:\Windows\explorer.exe" now owned by the administrators group.
C:\Windows\System32>icacls c:\Windows\explorer.exe /setowner "NT SERVICE\TrustedInstaller"
c:\Windows\explorer.exe: Access is denied.
Successfully processed 0 files; Failed processing 1 files
решение1
Итак, в заголовке указано восстановление TrustedInstaller.
Кажется, не хватает одной части: удаления добавленных разрешений группы администраторов.
takeown /F "C:\Windows\regedit.exe" /A
/F - file to become owner of
/A - means it will set the users group (ie. Administrators, not userxyz)
icacls "C:\Windows\regedit.exe" /grant Administrators:F
/grant - will add permissions
:F - Full Control
icacls "C:\Windows\regedit.exe" /setowner "NT SERVICE\TrustedInstaller"
/setowner - new owner
icacls "C:\Windows\regedit.exe" /grant:r Administrators:RX
/grant:r - will set permissions (removing higher ones)
:RX - Read and Execute
Ссылка: https://ss64.com/nt/icacls.html
решение2
Команда работает только после предоставления полных прав группе «Администраторы», т.е.:
icacls c:\Windows\explorer.exe /grant Administrators:f
Даже предоставления права «Изменить» по какой-то причине недостаточно.
решение3
Проблема, как вы обнаружили в своем ответе, заключается в том, что установка владельца файла требует специального разрешения, а именно «принять право владения». Причина, по которой графический интерфейс редактора ACL может установить владельца в любом случае, заключается в том, что он позволяетSeTakeOwnershipPrivilege
привилегия, что позволяет переопределить эту проверку доступа. Программы, работающие от имени администратора, имеют эту привилегию, но они должны явно включить ее перед использованием, и, по-видимому, icacls
этого не происходит.
Удобно, что процессы наследуют привилегии своего родителя по умолчанию, поэтому если вы можете включить эту привилегию для командной строки, из которой вы вызываете icacls
, утилита также будет иметь эту привилегию и сможет установить владельца. Вы можете использовать мою утилиту с открытым исходным кодомSprintDLLдля вызова соответствующих функций Win32 с целью включения привилегии в родительском процессе SprintDLL (командная строка):
SprintDLL call kernel32.dll!OpenProcess /return native /into prochandle (int 0x400, int 0, slotdata parentpid); newslot native token; call advapi32.dll!OpenProcessToken /return int (slotdata prochandle, int 0x20, slotptr token); newslot block luid = int 0, int 0; call advapi32.dll!LookupPrivilegeValueW /return int (nullptr, lpwstr "SeTakeOwnershipPrivilege", slotptr luid); newslot block privs = int 1, slotdata luid, int 2; call advapi32.dll!AdjustTokenPrivileges /return int (slotdata token, int 0, slotptr privs, slotsize privs as int, nullptr, nullptr)
Если это сработает, вывод покажет, что все три вызванные функции вернули 1. После этого вы сможете использовать функцию icacls
так, как вы изначально пытались.
решение4
Это сработало для меня на 64-битной системе (и моей проблеме)...
icacls c:\Windows\SysWOW64\usercpl.dll /grant Administrators:f
icacls "C:\Windows\SysWOW64\usercpl.dll" /setowner "NT SERVICE\TrustedInstaller"
/setowner - новый владелец