#c# #vb.net #winforms #active-directory
#c# #vb.net #winforms #active-directory
Вопрос:
У меня есть код, который возвращает список всех групп объявлений, членом которых является текущий пользователь приложения Windows Forms. Это используется для определения прав доступа. Некоторое время он работал нормально, но внезапно он не работает и возвращает ошибку «Некоторые или все ссылки на идентификаторы не удалось перевести». Обратите внимание, что эта ошибка возникает не тогда, когда я на виртуальной машине отлаживаю код, а только тогда, когда я публикую его и пытаюсь получить к нему доступ с общего диска нашей компании. Это может быть связано с некоторыми изменениями в безопасности сети и связано с разрешениями домена или чем-то подобным, но мой ИТ-отдел не помогает в этом отношении.
Ошибка находится в строке ниже:
Dim group As String = id_ref.Translate(GetType(NTAccount)).Value
Вся функция приведена ниже:
Shared Function GetGroupNames() As List(Of String)
'Returns a list of all groups the current user is a member of. Called from CheckAccess.
Dim groups As New List(Of String)
For Each id_ref As IdentityReference In WindowsIdentity.GetCurrent().Groups
Dim group As String = id_ref.Translate(GetType(NTAccount)).Value
If group.Contains("") Then
'Remove unneeded domain info.
group = group.Split("")(1).ToLower
End If
groups.Add(group)
Next
Return groups
End Function
Комментарии:
1. Попробуйте следующее:
Dim group As String = id_ref?.Translate(GetType(System.Security.Principal.NTAccount)).Value
а такжеIf Not String.IsNullOrEmpty(group) AndAlso group.Contains("") Then
. См. Следующую статью для получения дополнительной информации: docs.microsoft.com/en-us/dotnet/visual-basic/language-reference /…2. Спасибо, это решило мою проблему, и моя функция теперь работает отлично! Плюс ко всему, это.? условный оператор null — это то, о чем я ранее не знал, и что, вероятно, будет полезно в будущем. Превосходно!
3. Если вы хотите, чтобы я отметил это как ответ, просто опубликуйте это как ответ, и я это сделаю.
Ответ №1:
Перед вызовом убедитесь, что id_ref
это значение не равно null Translate
.
Вариант 1:
Dim group As String = id_ref?.Translate(GetType(System.Security.Principal.NTAccount)).Value
Получить имена групп
Shared Function GetGroupNames() As List(Of String)
'Returns a list of all groups the current user is a member of. Called from CheckAccess.
Dim groups As New List(Of String)
For Each id_ref As System.Security.Principal.IdentityReference In System.Security.Principal.WindowsIdentity.GetCurrent().Groups
Dim group As String = id_ref?.Translate(GetType(System.Security.Principal.NTAccount)).Value
If Not String.IsNullOrEmpty(group) Then
If group.Contains("") Then
'Remove unneeded domain info.
group = group.Split("")(1).ToLower
End If
groups.Add(group)
End If
Next
Return groups
End Function
Примечание: См. ?. and ?() null-условные операторы (Visual Basic) для получения дополнительной информации.
Вариант 2:
GetGroupNames
Shared Function GetGroupNames() As List(Of String)
'Returns a list of all groups the current user is a member of. Called from CheckAccess.
Dim groups As New List(Of String)
For Each id_ref As System.Security.Principal.IdentityReference In System.Security.Principal.WindowsIdentity.GetCurrent().Groups
If id_ref IsNot Nothing Then
Dim group As String = id_ref.Translate(GetType(System.Security.Principal.NTAccount)).Value
If Not String.IsNullOrEmpty(group) Then
If group.Contains("") Then
'Remove unneeded domain info.
group = group.Split("")(1).ToLower
End If
groups.Add(group)
End If
End If
Next
Return groups
End Function