在安装时更改文件的访问控制时出错

时间:2012-10-26 07:45:17

标签: c# file-io wix

我正在尝试在安装时更改文件的访问控制。更具体地说,通过Wix的自定义操作,所以我确信它是以管理员权限执行的。

这是代码:

   string pathVersioningDat = ConfigurationManager.GetPath("versioning.dat", true);
   FileSystemAccessRule rule = new FileSystemAccessRule("everyone", FileSystemRights.FullControl, AccessControlType.Allow);
   FileSecurity fSecurity = File.GetAccessControl(pathVersioningDat);
   fSecurity.SetAccessRule(rule);
   File.SetAccessControl(pathVersioningDat, fSecurity);

我知道它适用于多台电脑。它在任何W7简化版中都不起作用,在某些情况下也不适用于其他Windows 7版本。

异常消息(IdentityNotMappedException)是“无法翻译某些或所有身份引用”。看起来像“大家”用户在这些电脑中找不到,但我不确定。它发生在System.Security.Principal.NTAAccount.Translate方法。

有任何帮助吗?

2 个答案:

答案 0 :(得分:2)

这个问题很久以前就出现在我们的开发团队中。

您尚未指定Windows 7简化版的语言。我们意识到在许多装有Windows 7企业版或旗舰版的机器上,这个问题从未发生过,但是英文版的Starter Edition也没有。但是,在使用其他语言时(例如西班牙语),我们可以看到某些问题。

您是否尝试过从头开始安装英文Windows 7 Starter? (请注意,Windows 7 Starter不允许您在安装后更改语言)。

已编辑:

如果您希望将来避免此问题,可以使用此解决方案:

SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
string pathVersioningDat = ConfigurationManager.GetPath("versioning.dat", true);
FileSystemAccessRule rule = new FileSystemAccessRule(sid, FileSystemRights.FullControl, AccessControlType.Allow);
FileSecurity fSecurity = File.GetAccessControl(pathVersioningDat);
fSecurity.SetAccessRule(rule);
File.SetAccessControl(pathVersioningDat, fSecurity);

使用WellKnownSidType。WorldSid值,您无需担心目标操作系统中的初始语言。

告诉我它是否有帮助。

答案 1 :(得分:1)

antiocol seems to be right

在俄语版的Windows上, Everyone 被称为Все。这不仅限于Starter版本。所有内置帐户和组都已本地化。即使您稍后将语言更改为英语(在Ultimate版本中),内置帐户的名称仍为俄语。

我建议直接使用内置或Well-known SIDs。对于 Everyone ,请使用SECURITY_WORLD_SID_AUTHORITYSECURITY_WORLD_RID

我不能给你关于如何使用C#的代码示例。