【问题标题】:NetworkService permission (multi-language)NetworkService 权限(多语言)
【发布时间】:2010-03-30 13:35:16
【问题描述】:

所以,我正在做一个安装项目,全部用 VB.NET 编写,我需要授予 NetworkService 帐户,对某个文件夹的权限。

以下代码完美运行(Windows 7 - en-US):

Dim dInfo As New DirectoryInfo("C:\FolderOrFileToGivePermission")
Dim dSecurity As DirectorySecurity = dInfo.GetAccessControl()
dSecurity.AddAccessRule(New FileSystemAccessRule("NETWORK SERVICE", FileSystemRights.FullControl, AccessControlType.Allow))
dInfo.SetAccessControl(dSecurity)

当我在我的 Windows 7、Vista 或 XP(all in PT-BR)上尝试这个非常相同的代码时,问题开始了,我发现没有“NETWORK SERVICE”,正确的名称是“Serviço de Rede”。

我需要获取此名称才能将权限授予正确的用户。

经过对所有3个操作系统的大量调查,我发现用户的ID是:“S-1-5-20”,他在注册表上的路径是:Computer\HKEY_USERS\S-1-5- 20 及其默认文件夹:C:\Windows\ServiceProfiles\NetworkService

但我仍然没有找到实际的“可本地化”名称,我需要它是动态的,因为这个系统将安装在许多不同的国家(不同的机器和文化)。

提前致谢。

【问题讨论】:

    标签: vb.net permissions globalization


    【解决方案1】:

    使用System.Security.Principal.WellKnownSidType 枚举:

    SecurityIdentifier networkService = new SecurityIdentifier(
        WellKnownSidType.NetworkServiceSid, null);
    
    FileSystemAccessRule rule = new FileSystemAccessRule(
        networkService, FileSystemRights.FullControl, AccessControlType.Allow);
    

    【讨论】:

    • 这似乎是一个更干净更好的解决方案,不幸的是我不再在公司工作,也无法在项目上进行测试。
    【解决方案2】:

    所以,经过越来越多的研究,我改变了我在 Google 和 stackoverflow 上的搜索,并在另一个问题上找到了答案:

    The best way to resolve display username by SID?

    Dim NetworkServiceName as String = new SecurityIdentifier("S-1-5-20").Translate(typeof(NTAccount)).ToString();
    

    【讨论】:

    • 我很好奇如果您使用“NT AUTHORITY\NetworkService”而不是“NETWORK SERVICE”,它会起作用吗?
    • 在发布问题之前我已经在 Vista pt-BR 上尝试过,但没有奏效,显然是因为 pt-BR 上的“NT AUTHORITY”是“AUTORIDADE NT”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2013-10-12
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多