WiX установил разрешение на изменение папки App_Data для NetworkService

Я борюсь с этим. Мне нужно установить разрешения для папки App_Data на сайте ASP.Net, чтобы изменить для учетной записи NetworkService через мой установщик Wix. Я пробовал следующее, но безуспешно.

<CreateFolder>
  <util:PermissionEx GenericAll="yes" ChangePermission="yes" Delete="yes" 
    DeleteChild="yes" User="[WIX_ACCOUNT_NETWORKSERVICE]" />
</CreateFolder>

Я попытался также указать «Добавить», но получил сообщение об ошибке, что это запрещено.


person Mike Ward    schedule 06.10.2009    source источник
comment
Какую именно ошибку вы получаете?   -  person Shay Erlichmen    schedule 07.10.2009


Ответы (2)


Вам нужен User = "NetworkService". В коде SecureObj.cpp, поддерживающем PermissionEx, есть список известных пользователей.

    `// figure out the right user to put into the access block
    if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Everyone"))
    {
        hr = AclGetWellKnownSid(WinWorldSid, &psid);
    }
    else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Administrators"))
    {
        hr = AclGetWellKnownSid(WinBuiltinAdministratorsSid, &psid);
    }
    else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"LocalSystem"))
    {
        hr = AclGetWellKnownSid(WinLocalSystemSid, &psid);
    }
    else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"LocalService"))
    {
        hr = AclGetWellKnownSid(WinLocalServiceSid, &psid);
    }
    else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"NetworkService"))
    {
        hr = AclGetWellKnownSid(WinNetworkServiceSid, &psid);
    }
    else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"AuthenticatedUser"))
    {
        hr = AclGetWellKnownSid(WinAuthenticatedUserSid, &psid);
    }
    else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Guests"))
    {
        hr = AclGetWellKnownSid(WinBuiltinGuestsSid, &psid);
    }
    else if(!*pwzDomain && 0 == lstrcmpW(pwzUser, L"CREATOR OWNER"))
    {
        hr = AclGetWellKnownSid(WinCreatorOwnerSid, &psid);
    }
    else if (!*pwzDomain && 0 == lstrcmpW(pwzUser, L"INTERACTIVE"))
    {
        hr = AclGetWellKnownSid(WinInteractiveSid, &psid);
    }
    else if(!*pwzDomain && 0 == lstrcmpW(pwzUser, L"Users"))
    {
        hr = AclGetWellKnownSid(WinBuiltinUsersSid, &psid);
    }
    else`

Таблица LockPermission установщика Windows (элемент Permission в WiX) также поддерживает большинство известных имен, но они локализованы, что является действительно плохим дизайном, IMHO. Вот почему у WiX есть этот известный список.

person Rob Mensching    schedule 08.10.2009
comment
У меня было ощущение, что я был близок с первой попытки, но я натолкнулся на стену, и мне нужно было заставить что-то работать. Спасибо, что держали меня в курсе. - person Mike Ward; 08.10.2009
comment
Я вижу, где я ошибся. Я пробовал PermissionEx в одно время с сетевой службой (обратите внимание на пробел), потому что именно так он отображается в списке пользователей в диалоговом окне безопасности в Windows. В известном имени здесь нет места. - person Mike Ward; 08.10.2009
comment
Да, действительно, этот список в любом случае должен быть в документации. <вздох/> - person Rob Mensching; 08.10.2009
comment
Поскольку этого списка еще нет в документации, ЧТО МЫ можем сделать, чтобы его там найти? wixtoolset.org/documentation/manual/v3/xsd/util/ - person neslekkiM; 13.11.2014

Что ж, я придумал ответ (вероятно, не ответ). Вы не можете установить права доступа к файлу с помощью util: PermissionEx для учетной записи «Network Service» (это не очень известный sid или что-то в этом роде). В конце концов, я написал настраиваемое действие, которое устанавливает разрешение с помощью утилиты cacls.exe.

<CustomAction Id="PermissionAppData" Directory="TARGETDIR" 
  ExeCommand="&quot;[SystemFolder]cacls.exe&quot; 
  &quot;[INSTALLDIR]\App_Data&quot;
  /T /E /G &quot;NT AUTHORITY\Network Service:C&quot;" Return="check" />
person Mike Ward    schedule 07.10.2009
comment
Это не лучший ответ. :) Похоже, PermissionEx даст вам то, что вы хотите. - person Rob Mensching; 08.10.2009