2009-08-07 9 views
1

Je suis en quelque sorte sorti avec une signature pour cet appel api, mais l'appel ne fonctionne pas comme prévu. Certaines structures de données vitales ne sont pas correctement peuplées, par conséquent je ne reçois pas la sortie prévue. La signature que j'ai utilisée est:Besoin d'une signature C# pour AcquireCredentialsHandle win32 api fonction

[DllImport("secur32.dll", SetLastError = true)] 
    static extern ulong AcquireCredentialsHandle(
     string pszPrincipal, 
     string pszPackage, 
     ulong fCredentialsUse, 
     IntPtr pvLogonID, 
     ref SEC_WINNT_AUTH_IDENTITY pAuthData, 
     //IntPtr pAuthData, 
     IntPtr pGetKeyFn, 
     IntPtr pGetArgumentKey, 
     //ref SecHandle phCredential, 
     IntPtr phCredential, 
     ref TimeStamp ptsExpiry); 

Veuillez ignorer les commentaires.

L'appel de fonction c basé que j'ai utilisé pour référence peut être trouvé here. Je veux savoir ce que j'ai fait mal ...

Répondre

1

De pInvoke.net

[StructLayout(LayoutKind.Sequential)] 
public struct SECURITY_INTEGER 
{ 
    public uint LowPart; 
    public int HighPart; 
    public SECURITY_INTEGER(int dummy) 
    { 
    LowPart = 0; 
    HighPart = 0; 
    } 
}; 

[StructLayout(LayoutKind.Sequential)] 
public struct SECURITY_HANDLE 
{ 
    public uint LowPart; 
    public uint HighPart; 
    public SECURITY_HANDLE(int dummy) 
    { 
    LowPart = HighPart = 0; 
    } 
}; 


[DllImport("secur32.dll", SetLastError=true)] 
    static extern int AcquireCredentialsHandle(
    string pszPrincipal, //SEC_CHAR* 
    string pszPackage, //SEC_CHAR* //"Kerberos","NTLM","Negotiative" 
    int fCredentialUse, 
    IntPtr PAuthenticationID,//_LUID AuthenticationID,//pvLogonID, //PLUID 
    IntPtr pAuthData,//PVOID 
    int pGetKeyFn, //SEC_GET_KEY_FN 
    IntPtr pvGetKeyArgument, //PVOID 
    ref SECURITY_HANDLE phCredential, //SecHandle //PCtxtHandle ref 
    ref SECURITY_INTEGER ptsExpiry); //PTimeStamp //TimeStamp ref 
2

La struct ci-dessus ne semble pas correct que l'API 1 la documentation indique

typedef struct _SecHandle { 
    ULONG_PTR  dwLower; 
    ULONG_PTR  dwUpper; 
} SecHandle, * PSecHandle; 

Cela signifie que le code ci-dessus fonctionne sur 32 bits, mais devrait être

[StructLayout(LayoutKind.Sequential)] 
public struct SECURITY_HANDLE 
{ 
    public IntPtr LowPart; 
    public IntPtr HighPart; 
    public SECURITY_HANDLE(int dummy) 
    { 
     LowPart = HighPart = IntPtr.Zero; 
    } 
}; 

Ceci fonctionnera à la fois sur 32 bits et sur 64 bits il modes.

Le reste sera le même que précédemment

[StructLayout(LayoutKind.Sequential)] 
public struct SECURITY_INTEGER 
{ 
    public uint LowPart; 
    public int HighPart; 
    public SECURITY_INTEGER(int dummy) 
    { 
     LowPart = 0; 
     HighPart = 0; 
    } 
}; 

[DllImport("secur32.dll", SetLastError=true)] 
    static extern int AcquireCredentialsHandle(
    string pszPrincipal, //SEC_CHAR* 
    string pszPackage, //SEC_CHAR* //"Kerberos","NTLM","Negotiative" 
    int fCredentialUse, 
    IntPtr PAuthenticationID,//_LUID AuthenticationID,//pvLogonID,//PLUID 
    IntPtr pAuthData,//PVOID 
    int pGetKeyFn, //SEC_GET_KEY_FN 
    IntPtr pvGetKeyArgument, //PVOID 
    ref SECURITY_HANDLE phCredential, //SecHandle //PCtxtHandle ref 
    ref SECURITY_INTEGER ptsExpiry); //PTimeStamp //TimeStamp ref 

Vous devez également faire attention à libérer la poignée comme il est non géré.

Questions connexes