Funzione RasGetCredentialsA (ras.h)

La funzione RasGetCredentials recupera le credenziali utente associate a una voce di rubrica RAS specificata.

Sintassi

DWORD RasGetCredentialsA(
  [in]      LPCSTR            unnamedParam1,
  [in]      LPCSTR            unnamedParam2,
  [in, out] LPRASCREDENTIALSA unnamedParam3
);

Parametri

[in] unnamedParam1

Puntatore a una stringa con terminazione Null che specifica il percorso completo e il nome file di un file di rubrica telefonica (PBK). Se questo parametro è NULL, la funzione usa il file di rubrica predefinito corrente. Il file predefinito della rubrica telefonica è quello selezionato dall'utente nella finestra delle proprietà Preferenze utente della finestra di dialogo Rete remota.

[in] unnamedParam2

Puntatore a una stringa con terminazione Null che specifica il nome di una voce della rubrica telefonica.

[in, out] unnamedParam3

Puntatore alla struttura RASCREDENTIALS che, nell'output, riceve le credenziali utente associate alla voce di rubrica specificata.

In input impostare il membro dwSize della struttura su sizeof(RASCREDENTIALS) e impostare il membro dwMask per indicare le informazioni sulle credenziali da recuperare. Quando la funzione viene restituita, dwMask indica i membri che sono stati recuperati correttamente.

Valore restituito

Se la funzione ha esito positivo, il valore restituito viene ERROR_SUCCESS.

Se la funzione ha esito negativo, il valore restituito è uno dei codici di errore seguenti o un valore di Routing e Remote Access Error Codes o Winerror.h.

Valore Significato
ERROR_CANNOT_OPEN_PHONEBOOK
Impossibile trovare la rubrica specificata.
ERROR_CANNOT_FIND_PHONEBOOK_ENTRY
La voce specificata non esiste nella rubrica telefonica.
ERROR_INVALID_PARAMETER
Il parametro lpCredentials è NULL.
ERROR_INVALID_SIZE
Il membro dwSize della struttura RASCREDENTIALS è un valore non riconosciuto.

Commenti

La funzione RasGetCredentials recupera le credenziali dell'ultimo utente per connettersi usando la voce della rubrica telefonica specificata o le credenziali specificate successivamente in una chiamata alla funzione RasSetCredentials per la voce della rubrica telefonica.

Questa funzione è il modo preferito per recuperare in modo sicuro le credenziali associate a una voce di rubrica RAS. RasGetCredentials sostituisce la funzione RasGetEntryDialParams , che potrebbe non essere supportata nelle versioni future di Windows.

RasGetCredentials non restituisce la password effettiva. Il membro szPassword della struttura RASCREDENTIALS contiene invece un handle per la password salvata. Sostituire questo handle per la password salvata nelle chiamate successive a RasSetCredentials e RasDial. Quando viene visualizzato questo handle, RasDial recupera e usa la password salvata. Il valore di questo handle può cambiare nelle versioni future del sistema operativo; non sviluppare codice che dipende dal contenuto o dal formato di questo valore.

Il membro dwMask di RASCREDENTIALS contiene il flag RASCM_Password se il sistema ha salvato una password per la voce specificata. Se per questa voce non è stata salvata alcuna password, dwMask non contiene RASCM_Password.

Windows 2000/NT: Questa funzionalità non è supportata.

Se la maschera dwMask della struttura RASCREDENTIALS contiene il flag RASCM_DefaultCreds, le credenziali restituite sono le credenziali predefinite per una connessione all-utente.

Per recuperare una chiave precondi shared, usare il flag RASCM_PreSharedKey nel campo RASCREDENTIALS.dwMask.

Windows 2000/NT: Questa funzionalità non è supportata.

Il codice di esempio seguente crea la voce della rubrica "RasEntryName", ne imposta le credenziali usando RasSetCredentials e quindi recupera tali credenziali usando RasGetCredentials.

#include <windows.h>
#include "ras.h"
#include <stdio.h>
#include <tchar.h>
#include "strsafe.h"

#define PHONE_NUMBER_LENGTH 7
#define DEVICE_NAME_LENGTH 5
#define DEVICE_TYPE_LENGTH 5
#define DOMAIN_NAME_LENGTH 9
#define USER_NAME_LENGTH 11

DWORD __cdecl wmain(){

    DWORD dwRet = ERROR_SUCCESS;    
    LPTSTR lpszEntry = L"RasEntryName";
    LPTSTR lpszPhoneNumber = L"5555555";
    LPTSTR lpszDeviceName = L"Modem";
    LPTSTR lpszDeviceType = RASDT_Modem;
    LPTSTR lpszDomainName = L"RASDomain";
    LPTSTR lpszUserName = L"RASUserName";
    /***********************************************************************************************/
    // Create a new phone book entry
    /***********************************************************************************************/
  
    // Allocate heap memory for the RASENTRY structure
    LPRASENTRY lpentry = (LPRASENTRY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RASENTRY));
    if (lpentry == NULL){
        wprintf(L"HeapAlloc failed!\n");
        return 0;
    }
    // The RASENTRY->dwSize member has to be initialized or the RRAS RasValidateEntryName() and 
    // RasSetEntryProperties APIs will fail below.
    lpentry->dwSize = sizeof(RASENTRY);
    lpentry->dwFramingProtocol = RASFP_Ppp;
    lpentry->dwfOptions = 0;
    lpentry->dwType = RASFP_Ppp;
    dwRet |= StringCchCopyN(lpentry->szLocalPhoneNumber, RAS_MaxPhoneNumber, lpszPhoneNumber, PHONE_NUMBER_LENGTH);
    dwRet |= StringCchCopyN(lpentry->szDeviceName, RAS_MaxDeviceName, lpszDeviceName, DEVICE_NAME_LENGTH);
    dwRet |= StringCchCopyN(lpentry->szDeviceType, RAS_MaxDeviceType, lpszDeviceType, DEVICE_TYPE_LENGTH);
    if (dwRet != ERROR_SUCCESS){
        wprintf(L"RASENTRY structure initialization failed!\n");
        HeapFree(GetProcessHeap(), 0, lpentry);
        return 0;
    }

    // Validate the new entry's name
    dwRet = RasValidateEntryName(NULL, lpszEntry);
    if (dwRet != ERROR_SUCCESS){
        wprintf(L"RasValidateEntryName failed: Error = %d\n", dwRet);
        HeapFree(GetProcessHeap(), 0, lpentry);
        return 0;
        }

    // Create and set the new entry's properties
    dwRet = RasSetEntryProperties(NULL, lpszEntry, lpentry, lpentry->dwSize, NULL, 0);
    if (dwRet != ERROR_SUCCESS){
        wprintf(L"RasSetEntryProperties failed: Error = %d\n", dwRet);
        HeapFree(GetProcessHeap(), 0, lpentry);
        return 0;
    }

    /******************************************************************************************/
    // Set and get the new entry's credentials
    /******************************************************************************************/

    // Allocate heap memory for the RASCREDENTIALS structure
    LPRASCREDENTIALS lpCred = (LPRASCREDENTIALS) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RASCREDENTIALS));
    if (lpCred == NULL){
        wprintf(L"HeapAlloc failed!\n");
        return 0;
    }
    // The RASCREDENTIALS->dwsize member must be initialized or the RRAS RasSetCredentials() and 
    // RasGetCredentials() APIs will fail below
    lpCred->dwSize = sizeof(RASCREDENTIALS);

    // The entry's credentials must first be set with RasSetCredentials() before they can be 
    // retrieved with RasGetCredentials(). The values below are used to set the new entry's credentials.
    dwRet |= StringCchCopyN(lpCred->szDomain, DNLEN, lpszDomainName, DOMAIN_NAME_LENGTH);
    dwRet |= StringCchCopyN(lpCred->szUserName, UNLEN, lpszUserName, USER_NAME_LENGTH);
    if (dwRet != ERROR_SUCCESS){
        wprintf(L"RASCREDENTIALS structure initialization failed!\n");
        HeapFree(GetProcessHeap(), 0, lpCred);
        return 0;
    }
    // The username, password, and Domain credentials are valid
    lpCred->dwMask = RASCM_UserName | RASCM_Password | RASCM_Domain;
    
    // Set the newly created entry's credentials
    dwRet = RasSetCredentials(NULL, lpszEntry, lpCred, FALSE);
    
    // The same RASCREDENTIALS structure is used to 'set' and 'get' the credentials. Therefore, zero out 
    // its values. (this proves RasGetCredentials works below!) 
    dwRet |= StringCchCopyN(lpCred->szDomain, DNLEN, L"", 0);
    dwRet |= StringCchCopyN(lpCred->szUserName, UNLEN, L"", 0);
    dwRet |= StringCchCopyN(lpCred->szPassword, UNLEN, L"", 0);
    if (dwRet != ERROR_SUCCESS){
        wprintf(L"RASCREDENTIALS structure reset failed!\n");
        HeapFree(GetProcessHeap(), 0, lpCred);
        HeapFree(GetProcessHeap(), 0, lpentry);
        return 0;
    }

    // Grab the newly created entry's credentials
    dwRet = RasGetCredentials(NULL, lpszEntry, lpCred);
    if(dwRet == ERROR_SUCCESS){
        wprintf(L"The following credentials were retrieved for the entry: %s\n\tUser name: %s\n\tPassword: %s\n\tDomain: %s\n", lpszEntry, lpCred->szUserName, lpCred->szPassword, lpCred->szDomain);
    }else{
        wprintf(L"RasValidateEntryName failed: Error = %d\n", dwRet);
    }

    // Clean up: delete the new entry
    dwRet = RasDeleteEntry(NULL, lpszEntry);
    if (dwRet != ERROR_SUCCESS){
        wprintf(L"RasDeleteEntry failed: Error = %d\n", dwRet);
    }

    HeapFree(GetProcessHeap(), 0, lpentry);
    HeapFree(GetProcessHeap(), 0, lpCred);
    return 0;
}

Nota

L'intestazione ras.h definisce RasGetCredentials come alias che seleziona automaticamente la versione ANSI o Unicode di questa funzione in base alla definizione della costante del preprocessore UNICODE. La combinazione dell'utilizzo dell'alias indipendente dalla codifica con il codice che non è indipendente dalla codifica può causare mancate corrispondenze che generano errori di compilazione o di runtime. Per altre informazioni, vedere Convenzioni per i prototipi di funzioni.

Requisiti

   
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione ras.h
Libreria Rasapi32.lib
DLL Rasapi32.dll

Vedi anche

RASCREDENTIALS

RasGetEntryDialParams

RasSetCredentials

Panoramica del servizio accesso remoto (RAS)

Funzioni del Servizio di accesso remoto