WiX设置App_Data文件夹权限,使NetworkService可以修改

3

我对这个有些困惑。我需要通过我的Wix安装程序将ASP.Net网站中App_Data文件夹的权限设置为NetworkService账户的修改权限。我尝试了以下方法,但没有成功。

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

我尝试使用Append参数,但是收到了一个错误提示说不允许使用。


你具体遇到了哪个错误? - Shay Erlichmen
2个回答

6
你需要使用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`

Windows安装程序LockPermission表格(WiX中的Permission元素)也支持大多数知名名称,但是它们都是本地化的,这是一个非常糟糕的设计,我的看法是。这就是为什么WiX有这个已知列表的原因。

我有种感觉第一次尝试时很接近,但我撞上了一堵墙,必须让某些东西运作。谢谢你保持我的轨道清晰。 - Mike Ward
我知道我错在哪里了。我曾经尝试过使用“Network Service”(注意空格),因为这是Windows安全对话框中用户列表中显示的方式。而这里的通用名称没有空格。 - Mike Ward
是啊,那个列表本来就应该在文档中。 <叹气/> - Rob Mensching
由于此列表仍未包含在文档中,我们可以采取什么措施将其添加进去? http://wixtoolset.org/documentation/manual/v3/xsd/util/permissionex.html - neslekkiM

1

好的,我找到了一个答案(可能不是最佳答案)。你不能使用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" />

这不是最好的答案。 :) 似乎PermissionEx会给你想要的东西。 - Rob Mensching

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接