Во-первых, я знаю, как сделать то, что просит заголовок. Моя проблема заключается в выяснении, почему это не удается в определенных ситуациях. Для некоторого фона мне нужно создать локальную учетную запись пользователя и добавить этого пользователя в локальную группу администраторов независимо от того, является ли это средой AD или нет. Следующий пример кода работает в большинстве случаев.
Using pc = New PrincipalContext(ContextType.Machine, Environment.MachineName)
Using gp = GroupPrincipal.FindByIdentity(pc, "Administrators")
If gp.Members.Contains(up) = False Then
gp.Members.Add(up)
gp.Save()
End If
End Using
End Using
Однако, когда вы вошли в систему как пользователь AD, но отключил от сети, выдается «Сетевой путь не найден». исключение.
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
at System.DirectoryServices.AccountManagement.SAMStoreCtx.ResolveCrossStoreRefToPrincipal(Object o)
at System.DirectoryServices.AccountManagement.SAMMembersSet.MoveNextForeign()
at System.DirectoryServices.AccountManagement.SAMMembersSet.MoveNext()
at System.DirectoryServices.AccountManagement.PrincipalCollectionEnumerator.MoveNext()
at System.DirectoryServices.AccountManagement.PrincipalCollection.ContainsEnumTest(Principal principal)
Это имеет смысл, за исключением того, что я подумал, что не следует искать локальную группу в сети. Я могу успешно запустить это из командной строки:
net localgroup administrators username /add
, и она отлично работает. Поэтому мой вопрос заключается в том, как программно добавить локального пользователя в группу локальных администраторов независимо от сетевого подключения как в средах AD, так и в средах без AD. Если мне нужно просто вернуться к выполнению net .exe, пусть будет так, но, похоже, должен быть более элегантный способ.