Как запомнить ipaddress, используя CredentialManager?

Я должен запомнить имя пользователя и пароль, а также Ipaddress в приложении wpf, и я пытаюсь сделать это с помощью диспетчера учетных данных способом, приведенным по следующей ссылке: Шифрование учетных данных в приложении WPF

Он хорошо запоминает имя пользователя и пароль, но никогда не запоминает Ipaddres, которые я запомнил. Другая проблема заключается в том, что я забываю запоминание даже имени пользователя и пароля на следующий день, когда я включаю компьютер. Следует всегда помнить это.

Мой код здесь:

Для записи учетных данных в COM:

  public static int WriteCredential(string applicationName, string userName, string secret,string ipAddress)
        {
            byte[] byteArray = Encoding.Unicode.GetBytes(secret);
            if (byteArray.Length > 512)
                throw new ArgumentOutOfRangeException("secret", "The secret message has exceeded 512 bytes.");

            CREDENTIAL credential = new CREDENTIAL(); //see below my credential structure
            credential.AttributeCount = 0;
            credential.Attributes = IntPtr.Zero;
            credential.Comment = IntPtr.Zero;
            credential.TargetAlias = IntPtr.Zero;
            credential.Type = CredentialType.Generic;
            credential.Persist = (UInt32)CredentialPersistence.Session;
            credential.CredentialBlobSize = (UInt32)Encoding.Unicode.GetBytes(secret).Length;
            credential.TargetName = Marshal.StringToCoTaskMemUni(applicationName);
            credential.CredentialBlob = Marshal.StringToCoTaskMemUni(secret);
            credential.UserName = Marshal.StringToCoTaskMemUni(userName ?? Environment.UserName);
            credential.IpAddress= Marshal.StringToCoTaskMemUni(ipAddress);

            bool written = CredWrite(ref credential, 0);
            int lastError = Marshal.GetLastWin32Error();

            Marshal.FreeCoTaskMem(credential.TargetName);
            Marshal.FreeCoTaskMem(credential.CredentialBlob);
            Marshal.FreeCoTaskMem(credential.UserName);
            Marshal.FreeCoTaskMem(credential.IpAddress);

            if (written)
                return 0;

            throw new Exception(string.Format("CredWrite failed with the error code {0}.", lastError));
        }

Структура полномочий:

  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    private struct CREDENTIAL
    {
        public UInt32 Flags;
        public CredentialType Type;
        public IntPtr TargetName;
        public IntPtr Comment;
        public System.Runtime.InteropServices.ComTypes.FILETIME LastWritten;
        public UInt32 CredentialBlobSize;
        public IntPtr CredentialBlob;
        public UInt32 Persist;
        public UInt32 AttributeCount;
        public IntPtr Attributes;
        public IntPtr TargetAlias;
        public IntPtr UserName;
        public IntPtr IpAddress;
    }

Для чтения из COM:

  public static Credential ReadCredential(string applicationName)
        {
            IntPtr nCredPtr;
            bool read = CredRead(applicationName, CredentialType.Generic, 0, out nCredPtr);
            if (read)
            {
                using (CriticalCredentialHandle critCred = new CriticalCredentialHandle(nCredPtr))
                {
                    CREDENTIAL cred = critCred.GetCredential(); //cred.IpAddress gives me null here whereas it is not null in case of UserName and CredentialBlob
                    return ReadCredential(cred);
                }
            }
            return null;
        }

Как решить две проблемы:

(1) Как запомнить IP-адрес

(2) Как запомнить данные даже на следующий день после следующего включения ПК

Я нашел ответ на второй вопрос:CRED_PERSIST_LOCAL_MACHINE, но не первый Первый вопрос. Другое решение для второй проблемы, которое я мог найти, заключалось в создании " CredentialManager.WriteCredential(" Приложение ", userName + "+" + ipAddress, passWord);" а затем разделить, читая его на "+". Если кто-то знает, что решение лучше?

0 ответов

Другие вопросы по тегам