Aracılığıyla paylaş


Yeni Bilgisayar Hesabı Oluşturma

Aşağıdaki kod örneği, NetUserAdd işlevini kullanarak yeni bir bilgisayar hesabının nasıl oluşturulacağını gösterir.

Bilgisayar hesaplarını yönetmek için dikkat edilmesi gerekenler şunlardır:

  • Hesap yönetimi yardımcı programlarıyla tutarlılık için bilgisayar hesabı adının tamamı büyük harf olmalıdır.
  • Bilgisayar hesabı adının her zaman sonunda dolar işareti ($) vardır. Bilgisayar hesaplarını yönetmek için kullanılan tüm işlevler bilgisayar adını, bilgisayar hesabı adının son karakteri dolar işareti ($) olacak şekilde oluşturmalıdır. Etki alanı içi güven için hesap adı TrustingDomainName$'dır.
  • Bilgisayar adı uzunluğu üst sınırı MAX_COMPUTERNAME_LENGTH (15). Bu uzunluk, sondaki dolar işaretini ($) içermez.
  • Yeni bir bilgisayar hesabının parolası, sonunda dolar işareti ($) olmadan bilgisayar hesabı adının küçük harf gösterimi olmalıdır. Etki alanı arası güven için parola, ilişkinin güven tarafında belirtilen değerle eşleşen rastgele bir değer olabilir.
  • Parola uzunluğu üst sınırı LM20_PWLEN (14). Bilgisayar hesabı adı bu uzunluğu aşarsa parola bu uzunlukta kesilmelidir.
  • Bilgisayar hesabı oluşturma zamanında sağlanan parola yalnızca bilgisayar hesabı etki alanında etkin hale gelene kadar geçerlidir. Güven ilişkisi etkinleştirmesi sırasında yeni bir parola oluşturulur.
#include <windows.h>
#include <lm.h>
#pragma comment(lib, "netapi32.lib")

BOOL AddMachineAccount(
    LPWSTR wTargetComputer,
    LPWSTR MachineAccount,
    DWORD AccountType
    )
{
    LPWSTR wAccount;
    LPWSTR wPassword;
    USER_INFO_1 ui;
    DWORD cbAccount;
    DWORD cbLength;
    DWORD dwError;

    //
    // Ensure a valid computer account type was passed.
    //
    if (AccountType != UF_WORKSTATION_TRUST_ACCOUNT &&
        AccountType != UF_SERVER_TRUST_ACCOUNT &&
        AccountType != UF_INTERDOMAIN_TRUST_ACCOUNT
        ) 
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }

    //
    // Obtain number of chars in computer account name.
    //
    cbLength = cbAccount = lstrlenW(MachineAccount);

    //
    // Ensure computer name doesn't exceed maximum length.
    //
    if(cbLength > MAX_COMPUTERNAME_LENGTH) {
        SetLastError(ERROR_INVALID_ACCOUNT_NAME);
        return FALSE;
    }

    //
    // Allocate storage to contain Unicode representation of
    // computer account name + trailing $ + NULL.
    //
    wAccount=(LPWSTR)HeapAlloc(GetProcessHeap(), 0,
        (cbAccount + 1 + 1) * sizeof(WCHAR)  // Account + '$' + NULL
        );

    if(wAccount == NULL) return FALSE;

    //
    // Password is the computer account name converted to lowercase;
    //  you will convert the passed MachineAccount in place.
    //
    wPassword = MachineAccount;

    //
    // Copy MachineAccount to the wAccount buffer allocated while
    //  converting computer account name to uppercase.
    //  Convert password (in place) to lowercase.
    //
    while(cbAccount--) {
        wAccount[cbAccount] = towupper( MachineAccount[cbAccount] );
        wPassword[cbAccount] = towlower( wPassword[cbAccount] );
    }

    //
    // Computer account names have a trailing Unicode '$'.
    //
    wAccount[cbLength] = L'$';
    wAccount[cbLength + 1] = L'\0'; // terminate the string

    //
    // If the password is greater than the max allowed, truncate.
    //
    if(cbLength > LM20_PWLEN) wPassword[LM20_PWLEN] = L'\0';

    //
    // Initialize the USER_INFO_1 structure.
    //
    ZeroMemory(&ui, sizeof(ui));

    ui.usri1_name = wAccount;
    ui.usri1_password = wPassword;

    ui.usri1_flags = AccountType | UF_SCRIPT;
    ui.usri1_priv = USER_PRIV_USER;

    dwError=NetUserAdd(
                wTargetComputer,    // target computer name
                1,                  // info level
                (LPBYTE) &ui,       // buffer
                NULL
                );

    //
    // Free allocated memory.
    //
    if(wAccount) HeapFree(GetProcessHeap(), 0, wAccount);

    //
    // Indicate whether the function was successful.
    //
    if(dwError == NO_ERROR)
        return TRUE;
    else {
        SetLastError(dwError);
        return FALSE;
    }
}

Hesap yönetimi işlevlerini çağıran kullanıcının hedef bilgisayarda Yönetici ayrıcalığına sahip olması gerekir. Mevcut bilgisayar hesapları söz konusu olduğunda, hesabı oluşturan yönetici üyeliğinden bağımsız olarak hesabı yönetebilir. Yönetici ayrıcalıkları gerektiren işlevleri çağırma hakkında daha fazla bilgi için bkz. Özel Ayrıcalıklarla Çalıştırma.

SeMachineAccountPrivilege, belirtilen kullanıcılara bilgisayar hesapları oluşturma olanağı vermek için hedef bilgisayarda verilebilir. Bu, yönetici olmayanlara bilgisayar hesapları oluşturma olanağı sağlar. Çağıranın bilgisayar hesabını eklemeden önce bu ayrıcalığı etkinleştirmesi gerekir. Hesap ayrıcalıkları hakkında daha fazla bilgi için bkz. Privileges ve Authorization Constants.