Question

Solution (un peu):

Cette usurpation d'identité avec la sécurité .NET ne permet qu'un accès au niveau de l'application. Etant donné que l'objet COM est au niveau du système, l'utilisateur avec emprunt d'identité ne peut toujours pas l'instancier. J'ai compris cela en cliquant avec le bouton droit de la souris sur l'exécutable et en sélectionnant "Exécuter en tant que ...", le programme fonctionnait correctement. J'ai découvert que le programme est lancé avec un accès système (en supposant que l'utilisateur avec lequel vous l'exécutez possède ces informations d'identification). Je suis en train de créer un programme externe qui lancera cette application à l'aide de cette méthode.

Merci pour les conseils: D

J'ai une installation Windows XP sur une machine virtuelle. Cela fait partie de mon domaine, mais l'utilisateur connecté est un utilisateur local uniquement. Évidemment, si j'essaie d'accéder à un partage réseau, un mot de passe / utilisateur sera demandé:

 alt text

Le programme que je teste sur la machine virtuelle utilise un objet COM pour s’interfacer avec les données d’un autre programme. Si je n'emprunte pas l'identité, j'obtiens des erreurs car je ne dispose pas des informations d'identification appropriées.

J'ai effectué des recherches sur le sujet et trouvé un certain nombre de sites Web contenant une quantité décente d'informations VB.NET. Le problème que j'ai avec le code que j'ai écrit est que je peux accéder aux ressources du réseau, mais je ne peux pas instancier l'objet COM.

Si je remplis et soumets l'invite d'informations d'identification (ci-dessus) avant de tenter de l'instancier, cela fonctionne correctement. Cela me porte à croire qu'il doit y avoir quelque chose que l'invite d'identification WinXP fait que je ne suis pas. Vous trouverez ci-dessous le code que j'utilise pour l'emprunt d'identité:

Public Sub BeginImpersonation()
    Const LOGON32_PROVIDER_DEFAULT As Integer = 0
    Const LOGON32_LOGON_INTERACTIVE As Integer = 2
    Const SecurityImpersonation As Integer = 2

    Dim win32ErrorNumber As Integer

    _tokenHandle = IntPtr.Zero
    _dupeTokenHandle = IntPtr.Zero

    If Not LogonUser(_username, _domainname, _password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, _tokenHandle) Then
        win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()
        Throw New ImpersonationException(win32ErrorNumber, GetErrorMessage(win32ErrorNumber), _username, _domainname)
    End If

    If Not DuplicateToken(_tokenHandle, SecurityImpersonation, _dupeTokenHandle) Then
        win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()

        CloseHandle(_tokenHandle)
        Throw New ImpersonationException(win32ErrorNumber, "Unable to duplicate token!", _username, _domainname)
    End If

    Dim newId As New System.Security.Principal.WindowsIdentity(_dupeTokenHandle)
    _impersonatedUser = newId.Impersonate()
    _impersonating = True
End Sub

J'ai également essayé d'envoyer différents indicateurs à la méthode de l'imitation, mais rien ne semble fonctionner. Voici les différents drapeaux que j'ai trouvés:

Enum LOGON32_LOGON
    INTERACTIVE = 2
    NETWORK = 3
    BATCH = 4
    SERVICE = 5
    UNLOCK = 7
    NETWORK_CLEARTEXT = 8
    NEW_CREDENTIALS = 9
End Enum
Enum LOGON32_PROVIDER
    [DEFAULT] = 0
    WINNT35 = 1
    WINNT40 = 2
    WINNT50 = 3
End Enum
Enum SECURITY_LEVEL
    Anonymous = 0
    Identification = 1
    Impersonation = 2
    Delegation = 3
End Enum
Était-ce utile?

La solution

Je l'ai déjà rencontré auparavant et utilisé deux solutions différentes. La plus simple était d'utiliser une application tierce: TqcRunas: http://www.quimeras.com/Products/products.asp qui vous permet de conditionner les informations de certification requises dans un fichier crypté. Cependant, cela peut être difficile si le mot de passe est expiré.

L’autre solution que j’ai utilisée consiste à appeler un nouveau processus avec des informations d’identification alternatives:

        Dim myProcessStartInfo As ProcessStartInfo = New ProcessStartInfo

    With myProcessStartInfo

        .FileName = "file path and name"

        .Domain = "domainname"
        .UserName = "username"

        'password needs to be a SerureString
        Using NewPassword As New Security.SecureString
            With NewPassword
                For Each c As Char In "password".ToCharArray
                    .AppendChar(c)
                Next c
                .MakeReadOnly()
            End With
            .Password = NewPassword.Copy
        End Using

        'UseShellExecute must be false for impersonated process
        .UseShellExecute = False

    End With

    Using Process As New System.Diagnostics.Process
        With Process
            .StartInfo = myProcessStartInfo
            .Start()
        End With
    End Using

Autres conseils

Avec vos définitions, j'utilise

LogonUser(_username, _domainname, _password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, _tokenHandle)

dans mon code qui s’authentifie sur le réseau. J'emprunte l'identité d'un utilisateur local sur le boîtier distant, comme vous l'êtes. Il y a si longtemps que je ne me souviens pas de la raison pour laquelle nous avons utilisé ces valeurs.

Je fais la même chose en mappant les lecteurs réseau pour la copie de fichiers entre ordinateurs. Je n'ai pas écrit le code, mais c'est à peu près le même que le vôtre, à l'exception de deux choses:

  • Une fois que la méthode Impersonate a été renvoyée, je ferme les deux jetons à l'aide de la routine CloseHandle avant de quitter ma méthode d'impersonator.

  • Au sommet de l'imitateur, la première chose qui se passe est un appel à RevertToSelf, probablement pour annuler toute usurpation d'identité antérieure.

Je ne sais pas s'ils feraient une différence, mais ça vaut le coup d'essayer. Voici les déclarations pertinentes:

Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long
Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top