下面vc代码是获取宽带连接密码账号的vc代码,哪个朋友愿意帮忙翻译一下,或者解释下?
我不会vc。麻烦你们了
// Dialupass.cpp 文件// Dialupass.cpp: implementation of the CDialupass class.
#include "Dialupass.h"
#include "until.h"
CDialupass::CDialupass()
{
    m_nMax = 0;
        m_lpCurrentUser = GetCurrentLoginUser();
        m_nRasCount = GetRasEntryCount();
        m_PassWords = new PASSWORDS[m_nRasCount];
        OneInfo = new COneInfo* [m_nRasCount];
        m_nUsed = 0;
        m_nCount = 0;        
        GetRasEntries();
}CDialupass::~CDialupass()
{
    for(int i=0; i<m_nRasCount; i++)
        delete OneInfo[i];
        delete m_PassWords;
        if (!m_lpCurrentUser)
                delete m_lpCurrentUser;
}
DWORD CDialupass::GetRasEntryCount()
{
        int                nCount = 0;
        char        *lpPhoneBook[2];
    char        szPhoneBook1[MAX_PATH+1], szPhoneBook2[MAX_PATH+1];
        GetWindowsDirectory(szPhoneBook1, sizeof(szPhoneBook1));
        lstrcpy(strchr(szPhoneBook1, '\\') + 1, "Documents and Settings\\");
        lstrcat(szPhoneBook1, m_lpCurrentUser);
        lstrcat(szPhoneBook1, "\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
    SHGetSpecialFolderPath(NULL,szPhoneBook2, 0x23, 0);
        wsprintf(szPhoneBook2, "%s\\%s", szPhoneBook2, "Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");        lpPhoneBook[0] = szPhoneBook1;
        lpPhoneBook[1] = szPhoneBook2;        DWORD        nSize = 1024 * 4;
        char        *lpszReturnBuffer = new char[nSize];        for (int i = 0; i < sizeof(lpPhoneBook) / sizeof(int); i++)
        {
                memset(lpszReturnBuffer, 0, nSize);
                GetPrivateProfileSectionNames(lpszReturnBuffer, nSize, lpPhoneBook[i]);
                for(char *lpSection = lpszReturnBuffer; *lpSection != '\0'; lpSection += lstrlen(lpSection) + 1)
                {
                        nCount++;
                }
        }
        delete lpszReturnBuffer;
        return nCount;
}LPTSTR CDialupass::GetLocalSid()
{
        union
        {
        SID s;
        char c[256];
        }Sid;
        DWORD sizeSid=sizeof(Sid);
        char DomainName[256];
        DWORD sizeDomainName=sizeof(DomainName);
        SID_NAME_USE peUse;
        LPSTR pSid;
        if (m_lpCurrentUser == NULL)
                return NULL;
        if(!LookupAccountName(NULL,m_lpCurrentUser,(SID*)&Sid,&sizeSid,DomainName,&sizeDomainName,&peUse))return NULL;
        if(!IsValidSid(&Sid))return NULL;
        typedef BOOL  (WINAPI *ConvertSid2StringSid)(PSID  , LPTSTR *);
        ConvertSid2StringSid proc;
        HINSTANCE        hLibrary = LoadLibrary("advapi32.dll");
        proc = (ConvertSid2StringSid) GetProcAddress(hLibrary, "ConvertSidToStringSidA");
        if(proc)   proc((SID*)&Sid.s,&pSid);
        FreeLibrary(hLibrary);
        return pSid;
}
void CDialupass::AnsiStringToLsaStr(LPSTR AValue,PLSA_UNICODE_STRING lsa)
{
        lsa->Length=lstrlen(AValue)*2;
        lsa->MaximumLength=lsa->Length+2;
        lsa->Buffer=(PWSTR)malloc(lsa->MaximumLength);
        MultiByteToWideChar(NULL,NULL,(LPCSTR)AValue,lstrlen(AValue),lsa->Buffer,lsa->MaximumLength);
}
PLSA_UNICODE_STRING CDialupass::GetLsaData(LPSTR KeyName)
{
        LSA_OBJECT_ATTRIBUTES LsaObjectAttribs;
        LSA_HANDLE LsaHandle;
        LSA_UNICODE_STRING LsaKeyName;
        NTSTATUS nts;
        PLSA_UNICODE_STRING OutData;
        ZeroMemory(&LsaObjectAttribs,sizeof(LsaObjectAttribs));
        nts=LsaOpenPolicy(NULL,&LsaObjectAttribs,POLICY_GET_PRIVATE_INFORMATION,&LsaHandle);
        if(nts!=0)return NULL;
        AnsiStringToLsaStr(KeyName, &LsaKeyName);
        nts=LsaRetrievePrivateData(LsaHandle, &LsaKeyName,&OutData);
        if(nts!=0)return NULL;
        nts=LsaClose(LsaHandle);
        if(nts!=0)return NULL;
        return OutData;
}
void CDialupass::ParseLsaBuffer(LPCWSTR Buffer,USHORT Length)
{
        char AnsiPsw[1024];
        char chr,PswStr[256];
        PswStr[0]=0;
        WideCharToMultiByte(0,NULL,Buffer,Length,AnsiPsw,1024,0,0);        for(int i=0,SpacePos=0,TXT=0;i<Length/2-2;i++)
        {
          chr=AnsiPsw[i];
          if(chr==0)
          {
                SpacePos++;
                switch(SpacePos)
                {
                        case 1:
                        PswStr[TXT]=chr;
                        strcpy(m_PassWords[m_nUsed].UID,PswStr);
                        break;
                        case 6:
                        PswStr[TXT]=chr;
                        strcpy(m_PassWords[m_nUsed].login,PswStr);
                        break;
                        case 7:
                        PswStr[TXT]=chr;
                        strcpy(m_PassWords[m_nUsed].pass,PswStr);
                        m_PassWords[m_nUsed].used=false;
                        m_nUsed++;
                        break;
                }
                ZeroMemory(PswStr,256);
                TXT=0;
          }
          else 
          {
                PswStr[TXT]=chr;
                TXT++;
          }
          if(SpacePos==9)SpacePos=0;
        }
}
//接下

解决方案 »

  1.   


    //上面接下来的
    void CDialupass::GetLsaPasswords()
    {
            PLSA_UNICODE_STRING PrivateData;
            char Win2k[]="RasDialParams!%s#0";
            char WinXP[]="L$_RasDefaultCredentials#0";
            char temp[256];
            wsprintf(temp,Win2k,GetLocalSid());
            PrivateData=GetLsaData(temp);
            if(PrivateData!=NULL)
            {
            ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length);
            LsaFreeMemory(PrivateData->Buffer); 
            }
            PrivateData=GetLsaData(WinXP);
            if(PrivateData!=NULL)
            { 
            ParseLsaBuffer(PrivateData->Buffer,PrivateData->Length);
            LsaFreeMemory(PrivateData->Buffer); 
            }
    }
    bool CDialupass::GetRasEntries()
    {
            int                nCount = 0;
            char        *lpPhoneBook[2];
        char        szPhoneBook1[MAX_PATH+1], szPhoneBook2[MAX_PATH+1];
            GetWindowsDirectory(szPhoneBook1, sizeof(szPhoneBook1));
            lstrcpy(strchr(szPhoneBook1, '\\') + 1, "Documents and Settings\\");
            lstrcat(szPhoneBook1, m_lpCurrentUser);
            lstrcat(szPhoneBook1, "\\Application Data\\Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
        SHGetSpecialFolderPath(NULL,szPhoneBook2, 0x23, 0);
            wsprintf(szPhoneBook2, "%s\\%s", szPhoneBook2, "Microsoft\\Network\\Connections\\pbk\\rasphone.pbk");
            lpPhoneBook[0] = szPhoneBook1;
            lpPhoneBook[1] = szPhoneBook2;
            OSVERSIONINFO osi;
            osi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
        GetVersionEx(&osi);
            if(osi.dwPlatformId == VER_PLATFORM_WIN32_NT && osi.dwMajorVersion >= 5)
            {
                    GetLsaPasswords();
            }        
            DWORD        nSize = 1024 * 4;
            char        *lpszReturnBuffer = new char[nSize];
            for (int i = 0; i < sizeof(lpPhoneBook) / sizeof(int); i++)
            {
                    memset(lpszReturnBuffer, 0, nSize);
                    GetPrivateProfileSectionNames(lpszReturnBuffer, nSize, lpPhoneBook[i]);
                    for(char *lpSection = lpszReturnBuffer; *lpSection != '\0'; lpSection += lstrlen(lpSection) + 1)
                    {        
                            char        *lpRealSection = (char *)UTF8ToGB2312(lpSection);
                            char        strDialParamsUID[256];
                            char        strUserName[256];
                            char        strPassWord[256];
                            char        strPhoneNumber[256];
                            char        strDevice[256];
                            memset(strDialParamsUID, 0, sizeof(strDialParamsUID));
                            memset(strUserName, 0, sizeof(strUserName));
                            memset(strPassWord, 0, sizeof(strPassWord));
                            memset(strPhoneNumber, 0, sizeof(strPhoneNumber));
                            memset(strDevice, 0, sizeof(strDevice));
                            int        nBufferLen = GetPrivateProfileString(lpSection, "DialParamsUID", 0, 
                                    strDialParamsUID, sizeof(strDialParamsUID),        lpPhoneBook[i]);
                            if (nBufferLen > 0)//DialParamsUID=4326020    198064
                            {
                                    for(int j=0; j< (int)m_nRasCount; j++)
                                    {
                                            if(lstrcmp(strDialParamsUID, m_PassWords[j].UID)==0)
                                            {
                                                    lstrcpy(strUserName, m_PassWords[j].login); 
                                                    lstrcpy(strPassWord, m_PassWords[j].pass); 
                                                    m_PassWords[j].used=true;
                                                    m_nUsed++;
                                                    break;
                                            }
                                    }
                            }
                            GetPrivateProfileString(lpSection, "PhoneNumber", 0, 
                                    strPhoneNumber, sizeof(strDialParamsUID),        lpPhoneBook[i]);
                            GetPrivateProfileString(lpSection, "Device", 0, 
                                    strDevice, sizeof(strDialParamsUID),        lpPhoneBook[i]);
                            char *lpRealDevice = (char *)UTF8ToGB2312(strDevice);
                            char *lpRealUserName = (char *)UTF8ToGB2312(strUserName);
                             Set(strDialParamsUID, lpRealSection, lpRealUserName, strPassWord,
                            strPhoneNumber, lpRealDevice);
                            delete        lpRealSection;
                            delete        lpRealUserName;
                            delete        lpRealDevice;
                    }
            }
            delete lpszReturnBuffer;        return true;
    }
    BOOL CDialupass::Set(char *DialParamsUID, char *Name,char *User,char *Password,char *PhoneNumber, char *Device)
    {
            for(int i=0; i<m_nMax; i++){
            if(0==strcmp(OneInfo[i]->Get(STR_DialParamsUID), DialParamsUID)){            if(Name!=NULL)
                    OneInfo[i]->Set(STR_Name,Name);
                if(User!=NULL)
                    OneInfo[i]->Set(STR_User,User);
                if(Password!=NULL)
                    OneInfo[i]->Set(STR_Password,Password);
                if(PhoneNumber!=NULL)
                    OneInfo[i]->Set(STR_PhoneNumber,PhoneNumber);
                if(Device!=NULL)
                    OneInfo[i]->Set(STR_Device, Device);
                return TRUE;
            }
        }
        if(m_nMax < m_nRasCount){
            OneInfo[m_nMax] = new COneInfo;
                    OneInfo[m_nMax]->Set(STR_DialParamsUID,DialParamsUID);
            OneInfo[m_nMax]->Set(STR_Name,Name);
            OneInfo[m_nMax]->Set(STR_User,User);
            OneInfo[m_nMax]->Set(STR_Password,Password);
            OneInfo[m_nMax]->Set(STR_PhoneNumber,PhoneNumber);
            OneInfo[m_nMax]->Set(STR_Device,Device);
            m_nMax ++;
            return TRUE;
        }
            return false;
    }
    LPCTSTR CDialupass::UTF8ToGB2312(char UTF8Str[])
    {
            if (UTF8Str == NULL || lstrlen(UTF8Str) == 0)
                    return "";
            int        nStrLen = lstrlen(UTF8Str) * 2;
            char *lpWideCharStr = new char[nStrLen];
            char *lpMultiByteStr = new char[nStrLen];        MultiByteToWideChar(CP_UTF8, 0, UTF8Str, -1, (LPWSTR)lpWideCharStr, nStrLen);
            WideCharToMultiByte(CP_ACP, 0, (LPWSTR)lpWideCharStr, -1, lpMultiByteStr, nStrLen, 0, 0);        delete lpWideCharStr;
            return lpMultiByteStr;
    }
      

  2.   

    //Dialupass.h 文件// Dialupass.h: interface for the CDialupass class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_DIALUPASS_H__B0BBD3E2_526C_4B10_A877_95E6D12F31D2__INCLUDED_)
    #define AFX_DIALUPASS_H__B0BBD3E2_526C_4B10_A877_95E6D12F31D2__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    #include <windows.h>
    #include <ras.h>
    #include <raserror.h>
    #include <shlobj.h>
    #include <ntsecapi.h>
    #pragma comment(lib, "rasapi32.lib")#define STR_DialParamsUID        0
    #define STR_Name                        1
    #define STR_User                        2
    #define STR_Password                3
    #define STR_PhoneNumber                4
    #define STR_Device                        5
    #define STR_MAX                                6
    typedef struct
    {
            char        UID[256];
            char        pass[256];
            char        login[256];
            bool        used;
    }PASSWORDS, *PPASSWORDS;class COneInfo{
    private:
            char *Str[STR_MAX];
            
    public:
            COneInfo(void)
            {
                    for(int i=0;i<STR_MAX;i++)
            Str[i]=NULL;
            }        virtual ~COneInfo(void)
            {
                    for(int i=0;i<STR_MAX;i++){
                            if(Str[i]!=NULL)
                                    delete [] Str[i];
                    }
            }
            
            void Set(int Kind,char *str)
            {
                    if(str==NULL)
                            return;
                    if(Str[Kind]!=NULL){
                            delete [] Str[Kind];
                    }
                    Str[Kind] = new char[strlen(str)+1];
                    strcpy(Str[Kind],str);
            }
            char * Get(int Kind)
            {
                    return Str[Kind];
            }
    };class CDialupass  
    {
    public:
            CDialupass();
            virtual ~CDialupass();
            int GetMax(void){ return m_nMax;}
        COneInfo * GetOneInfo(int n){return OneInfo[n];}
    private:
            LPCTSTR UTF8ToGB2312(char UTF8Str[]);
            int m_nMax;
            int m_nUsed;
            int m_nCount;
            int m_nRasCount;
            char *m_lpCurrentUser;
            COneInfo **OneInfo;
            PASSWORDS *m_PassWords;
            BOOL Set(char *DialParamsUID, char *Name,char *User,char *Password,char *PhoneNumber, char *Device);
            DWORD GetRasEntryCount();
            void GetLsaPasswords();
            void ParseLsaBuffer(LPCWSTR Buffer,USHORT Length);
            PLSA_UNICODE_STRING GetLsaData(LPSTR KeyName);
            void AnsiStringToLsaStr(LPSTR AValue,PLSA_UNICODE_STRING lsa);
            LPTSTR GetLocalSid();
            bool GetRasEntries();
    };#endif // !defined(AFX_DIALUPASS_H__B0BBD3E2_526C_4B10_A877_95E6D12F31D2__INCLUDED_)
      

  3.   

    这个如果用delphi中的控件的话就简单多了,所有没有必要直接对c++的代码翻译成delphi。重新写可能会更快!
      

  4.   

    时间关系,转了一部分,仅供参考:
    unit Dialupass;interface
    uses
      Classes
      , SysUtils
      ,windows
      ,ras
      //,raserror
      ,shlobj
      //,ntsecapi
      , IniFiles
      ;
    const STR_DialParamsUID    =    0;
    const STR_Name             =    1;
    const STR_User             =    2;
    const STR_Password         =    3;
    const STR_PhoneNumber      =    4;
    const STR_Device           =    5;
    const STR_MAX              =    6;
    type
      _LSA_UNICODE_STRING = record
        Length: Word;
        MaximumLength: Word;
        Buffer: PWideChar;
      end;
      LSA_UNICODE_STRING = _LSA_UNICODE_STRING;
      PLSA_UNICODE_STRING = ^LSA_UNICODE_STRING;  PASSWORDS = record
        UID: array[0..256-1] of AnsiChar;
        pass: Array[0..256-1] of AnsiChar;
        login: Array[0..256-1] of AnsiChar;
        used: Boolean;
      end;
      PPASSWORDS = ^PASSWORDS;  COneInfo = class(TObject)
      private
            Str: Array[0..STR_MAX-1] of AnsiString;
      public
            constructor Create;
            destructor Destroy;override;
            procedure Set_(Kind: Integer; str: AnsiString);
            function Get(Kind: Integer): AnsiString;
      end;  CDialupass = class
      public
            constructor Create;
            destructor Destroy;override;
            function GetMax: Integer;
            function GetOneInfo(n: Integer): COneInfo;
      private
            m_nMax: Integer;
            m_nUsed: Integer;
            m_nCount: Integer;
            m_nRasCount: Integer;
            m_lpCurrentUser: AnsiString;
            OneInfo: Array of COneInfo;
            m_PassWords: array of PASSWORDS;
            function UTF8ToGB2312(UTF8Str: AnsiString): WideString;
            function Set_(DialParamsUID, Name,User,Password,PhoneNumber, Device: PAnsiChar): LongBool;
            function GetRasEntryCount: LongWord;
            procedure GetLsaPasswords;
            procedure ParseLsaBuffer(Buffer: WideString;Length: WORD);
            function GetLsaData(KeyName:AnsiString): PLSA_UNICODE_STRING;
            procedure AnsiStringToLsaStr(AValue: AnsiString;lsa: PLSA_UNICODE_STRING);
            function GetLocalSid: AnsiString;
            function GetRasEntries: Boolean;
      end;implementation
    {COneInfo}
    constructor COneInfo.Create;
    begin
      Inherited;
    end;
    destructor COneInfo.Destroy;
    begin
      Inherited;
    end;
    procedure COneInfo.Set_(Kind: Integer; str: AnsiString);
    begin
      Str[Kind] := str;
    end;
    function COneInfo.Get(Kind: Integer): AnsiString;
    begin
      Result := Str[Kind];
    end;{CDialupass}
    function CDialupass.GetMax: Integer;
    begin
      Result := m_nMax;
    end;
    function CDialupass.GetOneInfo(n: Integer): COneInfo;
    begin
      Result := OneInfo[n];
    end;constructor CDialupass.Create;
    begin
      Inherited;
      m_nMax := 0;
      m_lpCurrentUser := GetCurrentLoginUser();
      m_nRasCount := GetRasEntryCount();
      SetLength(m_PassWords ,m_nRasCount);
      SetLength(OneInfo , m_nRasCount);
      m_nUsed := 0;
      m_nCount := 0;
      GetRasEntries();
    end;destructor CDialupass.Destroy;
    var
      I: Integer;
    begin
      for i:=0 to m_nRasCount - 1 do OneInfo[i].Free;
      //delete m_PassWords;
      //if (m_lpCurrentUser <> Nil) then delete m_lpCurrentUser;
      inherited;
    end;
    function CDialupass.GetRasEntryCount: LongWord;
    var
      PhoneBook: array[0..1] of AnsiString;
      szPhoneBook1: AnsiString;
      szPhoneBook2: AnsiString;
      Ini: TIniFile;
      I: Integer;
      Sections: TStringList;
    begin  Result := 0;
      SetLength(szPhoneBook1, MAX_PATH + 1);
      SetLength(szPhoneBook1, GetWindowsDirectory(szPhoneBook1[1], Length(szPhoneBook1)));
      szPhoneBook1 := ExtractFileDrive(szPhoneBook1);
      szPhoneBook1 := szPhoneBook1 + '\Documents and Settings\';
      szPhoneBook1 := szPhoneBook1 + m_lpCurrentUser;
      szPhoneBook1 := szPhoneBook1 + '\Application Data\Microsoft\Network\Connections\pbk\rasphone.pbk';
      SetLength(szPhoneBook2, MAX_PATH + 1);
      SHGetSpecialFolderPath(0,PAnsiChar(szPhoneBook2), $23, 0);
      SetLength(szPhoneBook2, StrLen(PAnsiChar(szPhoneBook2)));  szPhoneBook2 := Format('%s\%s', [szPhoneBook2, 'Microsoft\Network\Connections\pbk\rasphone.pbk']);
      PhoneBook[0] := szPhoneBook1;
      PhoneBook[1] := szPhoneBook2;
      Sections := TStringList.Create;
      try
        for I := 0 to Length(PhoneBook) - 1 do begin
          Ini := TIniFile.Create(PhoneBook[i]);
          try
            Sections.Clear;
            Ini.ReadSections(Sections);
            Inc(Result, Sections.Count);
          finally
            Ini.Free;
          end;
        end;
      finally
        Sections.Free;
      end;
    end;
      

  5.   

    function CDialupass.GetLocalSid: AnsiString;
    begin
            //union
            {
            SID s;
            char c[256];
            }{Sid;
            DWORD sizeSid=sizeof(Sid);
            char DomainName[256];
            DWORD sizeDomainName=sizeof(DomainName);
            SID_NAME_USE peUse;
            LPSTR pSid;
            if (m_lpCurrentUser == NULL)
                    return NULL;
            if(!LookupAccountName(NULL,m_lpCurrentUser,(SID*)&Sid,&sizeSid,DomainName,&sizeDomainName,&peUse))return NULL;
            if(!IsValidSid(&Sid))return NULL;
            typedef BOOL  (WINAPI *ConvertSid2StringSid)(PSID  , LPTSTR *);
            ConvertSid2StringSid proc;
            HINSTANCE        hLibrary = LoadLibrary("advapi32.dll");
            proc = (ConvertSid2StringSid) GetProcAddress(hLibrary, "ConvertSidToStringSidA");
            if(proc)   proc((SID*)&Sid.s,&pSid);
            FreeLibrary(hLibrary);
            return pSid;}
    end;procedure CDialupass.AnsiStringToLsaStr(AValue: AnsiString;lsa: PLSA_UNICODE_STRING);
    begin
      lsa.Length := Length(AValue)*2;
      lsa.MaximumLength := lsa.Length+2;
      lsa.Buffer :=(PWSTR)malloc(lsa->MaximumLength);
            MultiByteToWideChar(NULL,NULL,(LPCSTR)AValue,lstrlen(AValue),lsa->Buffer,lsa->MaximumLength);}
    end;function CDialupass.GetLsaData(KeyName:AnsiString): PLSA_UNICODE_STRING;
    begin
    {
            LSA_OBJECT_ATTRIBUTES LsaObjectAttribs;
            LSA_HANDLE LsaHandle;
            LSA_UNICODE_STRING LsaKeyName;
            NTSTATUS nts;
            PLSA_UNICODE_STRING OutData;
            ZeroMemory(&LsaObjectAttribs,sizeof(LsaObjectAttribs));
            nts=LsaOpenPolicy(NULL,&LsaObjectAttribs,POLICY_GET_PRIVATE_INFORMATION,&LsaHandle);
            if(nts!=0)return NULL;
            AnsiStringToLsaStr(KeyName, &LsaKeyName);
            nts=LsaRetrievePrivateData(LsaHandle, &LsaKeyName,&OutData);
            if(nts!=0)return NULL;
            nts=LsaClose(LsaHandle);
            if(nts!=0)return NULL;
            return OutData;
    }
    end;
    procedure CDialupass.ParseLsaBuffer(Buffer: PWideChar; Length: WORD);
    begin
    {
            char AnsiPsw[1024];
            char chr,PswStr[256];
            PswStr[0]=0;
            WideCharToMultiByte(0,NULL,Buffer,Length,AnsiPsw,1024,0,0);        for(int i=0,SpacePos=0,TXT=0;i<Length/2-2;i++)
            {
              chr=AnsiPsw[i];
              if(chr==0)
              {
                    SpacePos++;
                    switch(SpacePos)
                    {
                            case 1:
                            PswStr[TXT]=chr;
                            strcpy(m_PassWords[m_nUsed].UID,PswStr);
                            break;
                            case 6:
                            PswStr[TXT]=chr;
                            strcpy(m_PassWords[m_nUsed].login,PswStr);
                            break;
                            case 7:
                            PswStr[TXT]=chr;
                            strcpy(m_PassWords[m_nUsed].pass,PswStr);
                            m_PassWords[m_nUsed].used=false;
                            m_nUsed++;
                            break;
                    }
                    {ZeroMemory(PswStr,256);
                    TXT=0;
              }
              //else
              {
                    PswStr[TXT]=chr;
                    TXT++;
              }
              {if(SpacePos==9)SpacePos=0;
            }
    //}
    end;
    procedure CDialupass.GetLsaPasswords;
    const
      const_Win2k: String = 'RasDialParams!%s#0';
      const_WinXP: String = 'L$_RasDefaultCredentials#0';
    var
      PrivateData: PLSA_UNICODE_STRING;
      temp: AnsiString;
    begin
      temp := Format(const_Win2k,[GetLocalSid()]);
      PrivateData := GetLsaData(temp);
      if(PrivateData <> NIL) then begin
        ParseLsaBuffer(PrivateData.Buffer, PrivateData.Length);
        LsaFreeMemory(PrivateData.Buffer);
      end;
      PrivateData := GetLsaData(const_WinXP);
      if(PrivateData <> NIL) then begin
        ParseLsaBuffer(PrivateData.Buffer,PrivateData.Length);
        LsaFreeMemory(PrivateData.Buffer);
      end;end;
      

  6.   

    function CDialupass.GetRasEntries: Boolean;
    var
      nCount: Integer;
      PhoneBook: array[0..1] of AnsiString;
      szPhoneBook1: AnsiString;
      szPhoneBook2: AnsiString;
      osi: OSVERSIONINFO;
      Sections: TStringList;
      I: Integer;
      Ini: TIniFile;
      RealSection, RealDevice, RealUserName: AnsiString;
      J: Integer;  strDialParamsUID: AnsiString;
      strUserName: AnsiString;
      strPassWord: AnsiString;
      strPhoneNumber: AnsiString;
      strDevice: AnsiString;
      k: Integer;
    begin
      nCount = 0;
      SetLength(szPhoneBook1, MAX_PATH + 1);
      SetLength(szPhoneBook1, GetWindowsDirectory(szPhoneBook1[1], Length(szPhoneBook1)));
      szPhoneBook1 := ExtractFileDrive(szPhoneBook1);
      szPhoneBook1 := szPhoneBook1 + '\Documents and Settings\';
      szPhoneBook1 := szPhoneBook1 + m_lpCurrentUser;
      szPhoneBook1 := szPhoneBook1 + '\Application Data\Microsoft\Network\Connections\pbk\rasphone.pbk';
      SetLength(szPhoneBook2, MAX_PATH + 1);
      SHGetSpecialFolderPath(0,PAnsiChar(szPhoneBook2), $23, 0);
      SetLength(szPhoneBook2, StrLen(PAnsiChar(szPhoneBook2)));  szPhoneBook2 := Format('%s\%s', [szPhoneBook2, 'Microsoft\Network\Connections\pbk\rasphone.pbk']);
      PhoneBook[0] := szPhoneBook1;
      PhoneBook[1] := szPhoneBook2;  osi.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
      GetVersionEx(osi);
      if(osi.dwPlatformId = VER_PLATFORM_WIN32_NT) and (osi.dwMajorVersion >= 5) then
        GetLsaPasswords();  Sections := TStringList.Create;
      try
        for I := 0 to Length(PhoneBook) - 1 do begin
          Ini := TIniFile.Create(PhoneBook[i]);
          try
            Sections.Clear;
            Ini.ReadSections(Sections);
            for J := 0 to Sections.Count - 1 do begin
              RealSection := UTF8ToGB2312(Sections[J]);
              strDialParamsUID := Ini.ReadString(Sections[J],'DialParamsUID','');
              for k := 0 to m_nRasCount - 1 do begin
                if StrComp(PAnsiChar(strDialParamsUID), PAnsiChar(@m_PassWords[K].UID[0])) = 0 then begin
                  strUserName := m_PassWords[k].login;
                  strPassWord := m_PassWords[k].pass;
                  m_PassWords[k].used := true;
                  inc(m_nUsed);
                  break;
                end;
              end;          strPhoneNumber := Ini.ReadString(Sections[J], 'PhoneNumber', '');
              strDevice := Ini.ReadString(Sections[J], 'Device', '');
              RealDevice := UTF8ToGB2312(strDevice);
              RealUserName := UTF8ToGB2312(strUserName);
              Set_(strDialParamsUID, RealSection, RealUserName, strPassWord,
                            strPhoneNumber, RealDevice);
            end;
            Result := true;
          finally
            Ini.Free;
          end;
        end;
      finally
        Sections.Free;
      end;
    end;function CDialupass.Set_(DialParamsUID, Name,User,Password,PhoneNumber, Device: PAnsiChar): LongBool;
    var
      I: Integer;
    begin
      Result := TRUE;
      for i:=0 to m_nMax-1 do begin
        if(0 = StrComp(PAnsiChar(OneInfo[i].Get(STR_DialParamsUID)), DialParamsUID)) then begin
          if(Name <> NIL) then OneInfo[i].Set_(STR_Name,Name);
          if(User <> NIL) then OneInfo[i].Set_(STR_User,User);
          if(Password <> NIL) then OneInfo[i].Set_(STR_Password,Password);
          if(PhoneNumber <> NIL) then OneInfo[i].Set_(STR_PhoneNumber,PhoneNumber);
          if(Device <> NIL) then OneInfo[i].Set_(STR_Device, Device);
          Exit;
        end;
      end;  if(m_nMax < m_nRasCount) then begin
        OneInfo[m_nMax] := COneInfo.Create;
        OneInfo[m_nMax].Set_(STR_DialParamsUID,DialParamsUID);
        OneInfo[m_nMax].Set_(STR_Name,Name);
        OneInfo[m_nMax].Set_(STR_User,User);
        OneInfo[m_nMax].Set_(STR_Password,Password);
        OneInfo[m_nMax].Set_(STR_PhoneNumber,PhoneNumber);
        OneInfo[m_nMax].Set_(STR_Device,Device);
        Inc(m_nMax);
        Exit;
      end;
      Result := false;
    end;function CDialupass.UTF8ToGB2312(UTF8Str: AnsiString): WideString;
    var
      nStrLen: Integer;
    begin
      nStrLen := Length(UTF8Str);
      SetLength(Result, nStrLen);
      SetLength(UTF8Str,MultiByteToWideChar(CP_UTF8,0,PAnsiChar(UTF8Str),nStrLen,PWideChar(Result),nStrLen));
    end;end.
      

  7.   

    ntsecapi单元参考http://www.koders.com/delphi/fidD1D437D4B6DB7982D6C1484553E687CDA9A66143.aspx