Melindungi Kata Sandi Masuk Otomatis

Kata sandi masuk otomatis harus dilindungi dengan menggunakan fungsi LsaStorePrivateData .

Contoh berikut menunjukkan cara melindungi kata sandi masuk otomatis. Contoh mengambil handel ke objek Policy dengan memanggil fungsi LsaOpenPolicy . Untuk informasi selengkapnya tentang objek Kebijakan dan penanganan objek Kebijakan , lihat Objek kebijakan dan Masing-masing Membuka Penanganan Objek Kebijakan. Contoh kemudian mengatur kata sandi yang dilindungi dengan memanggil fungsi LsaStorePrivateData . Perhatikan bahwa jika penelepon melewati NULL untuk nilai kata sandi yang dilindungi, maka kode akan menghapus kata sandi yang dilindungi yang ada. Sebelum keluar, kode menutup handel ke objek Policy .

#include <windows.h>
#include <stdio.h>

DWORD UpdateDefaultPassword(WCHAR * pwszSecret)
{

    LSA_OBJECT_ATTRIBUTES ObjectAttributes;
    LSA_HANDLE LsaPolicyHandle = NULL;

    LSA_UNICODE_STRING lusSecretName;
    LSA_UNICODE_STRING lusSecretData;
    USHORT SecretNameLength;
    USHORT SecretDataLength;

    NTSTATUS ntsResult = STATUS_SUCCESS;
    DWORD dwRetCode = ERROR_SUCCESS;

    //  Object attributes are reserved, so initialize to zeros.
    ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));

    //  Get a handle to the Policy object.
    ntsResult = LsaOpenPolicy(
        NULL,    // local machine
        &ObjectAttributes, 
        POLICY_CREATE_SECRET,
        &LsaPolicyHandle);

    if( STATUS_SUCCESS != ntsResult )
    {
        //  An error occurred. Display it as a win32 error code.
        dwRetCode = LsaNtStatusToWinError(ntsResult);
        wprintf(L"Failed call to LsaOpenPolicy %lu\n", dwRetCode);
        return dwRetCode;
    } 

    //  Initialize an LSA_UNICODE_STRING for the name of the
    //  private data ("DefaultPassword").
    SecretNameLength = (USHORT)wcslen(L"DefaultPassword");
    lusSecretName.Buffer = L"DefaultPassword";
    lusSecretName.Length = SecretNameLength * sizeof(WCHAR);
    lusSecretName.MaximumLength =
        (SecretNameLength+1) * sizeof(WCHAR);

    //  If the pwszSecret parameter is NULL, then clear the secret.
    if( NULL == pwszSecret )
    {
        wprintf(L"Clearing the secret...\n");
        ntsResult = LsaStorePrivateData(
            LsaPolicyHandle,
            &lusSecretName,
            NULL);
        dwRetCode = LsaNtStatusToWinError(ntsResult);
    }
    else
    {
        wprintf(L"Setting the secret...\n");
        //  Initialize an LSA_UNICODE_STRING for the value
        //  of the private data. 
        SecretDataLength = (USHORT)wcslen(pwszSecret);
        lusSecretData.Buffer = pwszSecret;
        lusSecretData.Length = SecretDataLength * sizeof(WCHAR);
        lusSecretData.MaximumLength =
            (SecretDataLength+1) * sizeof(WCHAR);
        ntsResult = LsaStorePrivateData(
            LsaPolicyHandle,
            &lusSecretName,
            &lusSecretData);
        dwRetCode = LsaNtStatusToWinError(ntsResult);
    }

    LsaClose(LsaPolicyHandle);

    if (dwRetCode != ERROR_SUCCESS)
        wprintf(L"Failed call to LsaStorePrivateData %lu\n",
            dwRetCode);
    
    return dwRetCode;

}

Perhatikan bahwa jika Winlogon tidak dapat menemukan kata sandi yang disimpan oleh fungsi LsaStorePrivateData , itu akan menggunakan nilai DefaultPassword dari kunci Winlogon (jika ada) untuk kata sandi masuk otomatis.

Untuk informasi selengkapnya tentang masuk otomatis dan kunci registri Winlogon, lihat FiturMSGina.dll.

Untuk informasi selengkapnya tentang melindungi kata sandi, lihat Menangani Kata Sandi.