Dela via


Skapa ett nytt datorkonto

Följande kodexempel visar hur du skapar ett nytt datorkonto med hjälp av funktionen NetUserAdd.

Följande är överväganden för att hantera datorkonton:

  • Datorkontots namn ska vara enbart versaler för överensstämmelse med verktyg för kontohantering.
  • Ett datorkontonamn har alltid ett avslutande dollartecken ($). Alla funktioner som används för att hantera datorkonton måste skapa datornamnet så att det sista tecknet i datorkontonamnet är ett dollartecken ($). För interdomänförtroende är kontonamnet TrustingDomainName$.
  • Den maximala längden på datornamn är MAX_COMPUTERNAME_LENGTH (15). Den här längden inkluderar inte det avslutande dollartecknet ($).
  • Lösenordet för ett nytt datorkonto ska vara en gemen representation av datorkontots namn, utan det avslutande dollartecknet ($). För interdomänförtroende kan lösenordet vara ett godtyckligt värde som matchar det värde som anges på förtroendesidan för relationen.
  • Den maximala lösenordslängden är LM20_PWLEN (14). Lösenordet bör trunkeras till den här längden om datorkontots namn är längre än den här längden.
  • Lösenordet som angavs vid skapandetiden för datorkontot är endast giltigt tills datorkontot blir aktivt i domänen. Ett nytt lösenord upprättas under aktiveringen av förtroenderelationen.
#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;
    }
}

Användaren som anropar kontohanteringsfunktionerna måste ha administratörsbehörighet på måldatorn. När det gäller befintliga datorkonton kan skaparen av kontot hantera kontot, oavsett administrativt medlemskap. Mer information om att anropa funktioner som kräver administratörsbehörighet finns i Köra med speciella privilegier.

SeMachineAccountPrivilege kan beviljas på måldatorn för att ge angivna användare möjlighet att skapa datorkonton. Detta ger icke-administratörer möjlighet att skapa datorkonton. Anroparen måste aktivera den här behörigheten innan du lägger till datorkontot. Mer information om kontobehörigheter finns i Privilegier och auktoriseringskonstanter.