Новая проблема с ранее работавшим кодом для поиска всех групп объявлений, членом которых является пользователь (не удалось перевести некоторые или все ссылки на идентификаторы)

#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