En réponse à la question this j'espère que quelqu'un peut aider avec l'API CredEnumerate.Aide avec CredEnumerate
D'après ce que je comprends de la documentation, le paramètre PCREDENTIALS out est un "pointeur vers un tableau de pointeurs vers des informations d'identification". Je suis capable d'appeler l'API CredEnumerate en utilisant C#, mais je ne suis pas sûr de savoir comment convertir les PCREDENTIALS en quelque chose d'utile (comme une liste d'informations d'identification).
Edit: Voici le code que je utilise:
int count = 0;
IntPtr pCredentials = IntPtr.Zero;
bool ret = false;
ret = CredEnumerate(null, 0, out count, out pCredentials);
if (ret != false)
{
IntPtr[] credentials = new IntPtr[count];
IntPtr p = pCredentials;
for (int i = 0; i < count; i++)
{
p = new IntPtr(p.ToInt32() + i);
credentials[i] = Marshal.ReadIntPtr(p);
}
List<Credential> creds = new List<Credential>(credentials.Length);
foreach (IntPtr ptr in credentials)
{
creds.Add((Credential)Marshal.PtrToStructure(ptr, typeof(Credential)));
}
}
Malheureusement, alors que cela fonctionne pour la première lettres de créance dans le tableau-il est généré et ajouté à la liste des éléments du tableau correctement-après la bombe au maréchal. PtrToStructure avec l'erreur suivante:
Vous avez tenté de lire ou d'écrire de la mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue.
Des idées? N'importe qui? Bueller?
La structure PCREDENTIAL sera probablement ceci: http://msdn.microsoft.com/en-us/library/aa374788(v = vs.85) .aspx –
La définition de 'p = new IntPtr (p.ToIntNN() + n)' signifie que le décalage du tableau saute de plus en plus vite. Mieux vaut remplacer l'ensemble de la boucle interne par credentials [n] = Marshal.ReadIntPtr (pCredentials, n * Marshal.SizeOf (typeof (IntPtr))); ' – Brian
Oui cela fait plus de sens, mettra à jour. – cfeduke