Разрешение NetworkService (многоязычное) - PullRequest
4 голосов
/ 30 марта 2010

Итак, я делаю проект установки, все написано в VB.NET, и мне нужно дать учетной записи NetworkService разрешение на определенную папку.

Следующий код отлично работает (Windows 7 - ru-ru):

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 ( все в PT-BR ), я обнаружил, что нет "NETWORK SERVICE", правильное имя "Сервико де Реде".

Мне нужно получить это имя, чтобы дать разрешение нужному пользователю.

После большого количества исследований на всех 3 ОС я обнаружил, что идентификатор пользователя: «S-1-5-20», его путь в реестре: Computer \ HKEY_USERS \ S-1-5- 20 и папка по умолчанию для него: C: \ Windows \ ServiceProfiles \ NetworkService

Но я все еще не нашел фактическое «локализуемое» имя, и мне нужно, чтобы оно было динамичным, потому что эта система будет установлена ​​во многих разных странах (разных машинах и культурах).

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 06 мая 2012

Используйте перечисление System.Security.Principal.WellKnownSidType :

SecurityIdentifier networkService = new SecurityIdentifier(
    WellKnownSidType.NetworkServiceSid, null);

FileSystemAccessRule rule = new FileSystemAccessRule(
    networkService, FileSystemRights.FullControl, AccessControlType.Allow);
1 голос
/ 30 марта 2010

Итак, после все большего количества исследований, я изменил свой поиск по Google и stackoverflow, и я нашел ответ на другой вопрос:

Лучший способ разрешить отображение имени пользователя по SID?

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