
Есть ли способ запретить чтение и/или запись в определенную папку в Windows и предоставить доступ к ней только определенной службе/процессу?
Похоже, что разрешения привязаны к пользователю, а не к службе, но мне бы хотелось узнать, есть ли способ реализовать такую функциональность в любом случае.
решение1
Да, в Windows 7 это можно сделать, хотя для этого может потребоваться перенастройка службы, что влечет за собой (вероятно, довольно небольшой) риск возникновения проблем с совместимостью.
Идентификатор безопасности, связанный со службой, может быть обозначен как
NT SERVICE\SERVICENAME
где servicename
заменяется на фактическое имя службы (отображается как «Имя службы» в административном инструменте служб и отличается от отображаемого имени, отображаемого в основном списке служб). Если вы используете графический интерфейс для изменения настроек безопасности, а машина присоединена к домену, вам нужно будет изменить область поиска на локальный компьютер. Также обратите внимание, что это работает только для служб, которые в данный момент установлены.
Вы можете определить SID, связанный с определенным именем службы, независимо от того, установлена ли такая служба, с помощью команды sc showsid
:
C:\working>sc showsid wjkjk
NAME: wjkjk
SERVICE SID: S-1-5-80-492907775-8774055-3223757035-3566066944-1037782649
Если вы устанавливаете безопасность файла или папки с помощью icacls
команды, вы можете указать SID, добавив к нему префикс *
, например, *S-1-5-80-492907775-8774055-3223757035-3566066944-1037782649
.
Чтобы служба могла получить доступ к файлам с помощью этого идентификатора безопасности, она должна быть настроена с типом SID службы "unrestricted" или "restricted". Если она настроена с типом SID службы "none", то SID службы не будет работать. Вы можете проверить тип SID службы установленной службы с помощью команды sc qsidtype
:
C:\working>sc qsidtype wuauserv
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: wuauserv
SERVICE_SID_TYPE: UNRESTRICTED
Если тип службы — «none», вы можете изменить его на «unrestricted» с помощью sc sidtype
команды:
C:\working>sc qsidtype psexesvc
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: psexesvc
SERVICE_SID_TYPE: NONE
C:\working>sc sidtype psexesvc unrestricted
[SC] ChangeServiceConfig2 SUCCESS
C:\working>sc qsidtype psexesvc
[SC] QueryServiceConfig2 SUCCESS
SERVICE_NAME: psexesvc
SERVICE_SID_TYPE: UNRESTRICTED
Изменения не вступят в силу до перезапуска службы.
Примечание:вам следуетнетизменить тип SID службы с "none" на "restricted". Это почти наверняка приведет к сбоям в работе службы. Изменение типа с "none" на "unrestricted" гораздо менее вероятно вызовет какие-либо проблемы. Если тип SID службы уже "restricted" или "unlimited", вам не следует его менять.
решение2
Существует псевдо-«пользователь», SERVICE
который используется всеми службами, поэтому вы можете просто ограничить доступ, разрешив доступ только этому «пользователю».
Однако это не совсем то, что вы просили, поскольку это не одна конкретная служба, это все службы. Нет механизма по умолчанию, чтобы ограничиться одной службой, хотя этоможетвозможно, если приложить немало усилий, чтобы заставить службу использовать другой идентификатор при запуске — я бы не рекомендовал этого делать.