Come posso fare in modo programmatico la creazione del profilo di un nuovo utente Windows?


20

Sto creando un utente (locale) per l'esecuzione di un servizio Windows. Ho buone ragioni per non voler usare SERVIZIO DI RETE, SERVIZIO LOCALE o SISTEMA LOCALE.

Creo l'utente tramite net user foobar "Abcd123!" /add: funziona perfettamente.

A questo punto, c:\users\foobarnon esiste.

Se io creo directory home dell'utente, prima che l'utente sia accede (o, più pertinente) o il servizio che l'utente è per avvia, Windows crea un profilo utente porta accanto chiamato c:\users\foobar-{gibberish/SID/whatever}- questo non è un nome prevedibile.

Ho bisogno che la home directory dell'utente contenga cose come una .sshdirectory, a .gitconfig- strumenti del genere (non limitati a quegli strumenti) che fanno supposizioni che sarà una persona che li utilizza, e quindi la configurazione dell'utente va dentro ~/.... Di solito, strumenti da un patrimonio Unix.

Domanda reale

Quindi - esiste un modo programmatico (preferibilmente, PowerShell o da riga di comando pronto all'uso) per dire a Windows di creare il profilo utente per un utente locale?

O altre soluzioni alternative?

Cose che devo ancora provare:

  • Un hook di avvio / pre NSSM che copia i file da altrove nella directory del profilo utente che si spera esista a questo punto in virtù dell'avvio di Windows del servizio, della creazione del profilo utente e del controllo del wrapper NSSM che esegue il hook prima dell'avvio.
  • L'impostazione della variabile di ambiente USERPROFILE per il servizio deve essere in un posto diverso dalla directory del profilo utente effettiva. Questo mi sembra pericolosamente fuoripista ma potrebbe anche funzionare bene.

Altro contesto:

  • Windows Server 2016, esperienza desktop.
    • Impossibile utilizzare Core / Nano.
  • Non ci sono directory attive in gioco. Non ci sarà.
  • Questi sono utenti locali.
  • Lo sto facendo tramite Ansible, che sta usando PowerShell sotto il cofano per le cose di Windows. In particolare il modulo win_user , con Ansible 2.7.5.
  • Non voglio creare un C:\users\default(l'equivalente di /etc/skel), perché ci sono alcuni utenti di servizi diversi e una dimensione non va bene per tutti. Anche questo non influisce sulla creazione del profilo utente, ma solo su cosa ci sarà.
  • Sto usando NSSM per gestire i servizi.

Cose che ho provato

  • avviare il servizio e consentire a Windows di creare la directory
    • Non voglio farlo, perché il servizio richiede segreti prima di avviarsi, quindi se lo faccio all'interno del mio processo di cottura delle immagini dovrò quindi pulirli e assicurarmi che il mio servizio non lo faccia qualsiasi lavoro durante la fase di cottura. Voglio evitare entrambi quei pezzi difficili.

1
Hai controllato le opzioni net user(ad es. /HOMEDIRO /PROFILEPATH)? . Vedere net user /help. Dalla mia comprensione (non testata), è possibile creare una directory per l'utente e impostarla come homedir con l' /HOMEDIRopzione.
Sven

Posso chiederti quale caso d'uso hai per evitare Active Directory? Le cose sarebbero molto più facili con l'AD. Solo curioso.
Ondrej Tucny,

Sto evitando AD perché le macchine sono effimere; le vite sono misurate in ore, non in giorni. Le macchine ospitano ambienti di costruzione in clean room. La manipolazione di macchine in entrata e in uscita da un annuncio come vanno e vengono non ne vale la pena (vedi anche medium.com/palantir/active-directory-as-code-e9666a2e548d se sei interessato a farlo).
Peter Mounce

@Sven yes - purtroppo nessuno dei due causa la creazione del profilo stesso, anche se imposta il percorso.
Peter Mounce

Risposte:


23

Windows può creare un profilo utente su richiesta, utilizzando l' API CreateProfile

Tuttavia, se non si desidera creare un eseguibile per eseguire questa operazione, è possibile chiamare l'API in PowerShell. Altri l'hanno già fatto: esempio su Github .

Parte pertinente del codice:

$methodName = 'UserEnvCP'
$script:nativeMethods = @();

Register-NativeMethod "userenv.dll" "int CreateProfile([MarshalAs(UnmanagedType.LPWStr)] string pszUserSid,`
  [MarshalAs(UnmanagedType.LPWStr)] string pszUserName,`
  [Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, uint cchProfilePath)";

Add-NativeMethods -typeName $MethodName;

$localUser = New-Object System.Security.Principal.NTAccount("$UserName");
$userSID = $localUser.Translate([System.Security.Principal.SecurityIdentifier]);
$sb = new-object System.Text.StringBuilder(260);
$pathLen = $sb.Capacity;

Write-Verbose "Creating user profile for $Username";
try
{
    [UserEnvCP]::CreateProfile($userSID.Value, $Username, $sb, $pathLen) | Out-Null;
}
catch
{
    Write-Error $_.Exception.Message;
    break;
}

Grazie mille, questo funziona per me. Nota agli altri: le funzioni Register-NativeMethod e Add-NativeMethods sono nell'essenziale collegato.
Peter Mounce,

17

Tutto quello che devi fare è eseguire un comando come quell'utente, Windows creerà il profilo:

psexec.exe -u foobar -p Abcd123! cmd.exe /c exit

https://docs.microsoft.com/en-us/sysinternals/downloads/psexec


1
Quindi, ciò che sta accadendo qui psexec dovrebbe connettersi a localhost con nome utente e password specificati con -ue -pe lanciarsi cmdsolo per uscire immediatamente. Mi sono perso qualcosa? Questo suona in qualche modo controintuitivo: la connessione al sistema con nome utente e password inesistenti dovrebbe essere un errore. Come funziona ?
Sergiy Kolodyazhnyy,

1
@SergiyKolodyazhnyy: Perché pensi che sia un nome utente e una password inesistenti? È lo stesso usato nella domanda, ovviamente come esempio ...
Ben Voigt,

1
@BenVoigt Bene, ho perso la parte superiore della domanda. Pensavo che OP volesse creare anche l'utente ed è quello che avrebbe dovuto fare questa risposta. Quindi l'ultima parte del commento è un malinteso.
Sergiy Kolodyazhnyy,

@BenVoigt Anche se ho ancora una domanda. OP ha menzionato "Non voglio creare C: \ users \ default". Quindi da dove verrebbe il profilo dell'utente quando viene utilizzato questo metodo e come farebbe Windows a sapere se creare directory specifiche preconfigurate C:\users\defaults?
Sergiy Kolodyazhnyy,

1
@SergiyKolodyazhnyy: OP abbastanza sicuro significa che non vuole personalizzare C: \ Users \ Default ... non che mancherà del tutto. Windows creerà la home directory C: \ Users \ foobar copiando dalla semplice vaniglia C: \ Users \ default, quindi una volta che esiste OP potrà applicare la sua salsa speciale a C: \ Users \ foobar dove non influirà su nessun altro utenti.
Ben Voigt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.