¿Cómo puedo hacer que se cree un nuevo perfil de usuario de Windows mediante programación?

20

Estoy creando un usuario (local) para que se ejecute un servicio de Windows. Tengo buenas razones para no querer usar SERVICIO DE RED, SERVICIO LOCAL o SISTEMA LOCAL.

Creo al usuario a través de net user foobar "Abcd123!" /add- esto funciona bien.

En este punto, c:\users\foobarno existe.

Si creo el directorio de inicio del usuario, antes de que el usuario inicie sesión (o, más pertinente) o se inicie el servicio para el que está, Windows crea un perfil de usuario de al lado llamado c:\users\foobar-{gibberish/SID/whatever}: este no es un nombre predecible.

Necesito que el directorio de inicio del usuario contenga cosas como un .sshdirectorio, a .gitconfig- herramientas como esa (no limitadas a esas herramientas) que hacen suposiciones de que será una persona que las use, y así la configuración del usuario entra ~/.... Por lo general, las herramientas de un patrimonio de Unix.

Pregunta real

Entonces, ¿hay una forma programática (preferiblemente, PowerShell o línea de comandos lista para usar) para decirle a Windows que cree el perfil de usuario para un usuario local?

¿O alguna otra solución?

Cosas que todavía tengo que probar:

  • Un enlace de inicio / pre NSSM que copia archivos desde otro lugar en el directorio de perfil de usuario que, con suerte, existe en este punto en virtud de que Windows inicia el servicio, crea el perfil de usuario y luego entrega el control al contenedor NSSM que ejecuta el enlace antes del inicio.
  • Establecer la variable de entorno USERPROFILE para que el servicio esté en otro lugar que no sea el directorio de perfil de usuario real. Esto me parece peligrosamente fuera de pista, pero también podría funcionar bien.

Otro contexto:

  • Windows Server 2016, experiencia de escritorio.
    • No se puede usar Core / Nano.
  • No hay un directorio activo en juego. No habra
  • Estos son usuarios locales.
  • Estoy haciendo esto a través de Ansible, que está usando PowerShell bajo el capó para las cosas de Windows. Específicamente el módulo win_user , con Ansible 2.7.5.
  • No quiero crear un C:\users\default(el equivalente de /etc/skel), porque hay algunos usuarios de servicio diferentes y un tamaño no sirve para todos. Esto tampoco afecta cuando se crea el perfil de usuario, solo lo que estará en él cuando lo esté.
  • Estoy usando NSSM para administrar los servicios.

Cosas que he probado

  • iniciar el servicio y permitir que Windows cree el directorio
    • No quiero hacer esto, porque el servicio requiere secretos antes de comenzar, por lo que si hago esto dentro de mi proceso de cocción de imágenes, tendré que limpiarlos y también asegurarme de que mi servicio no lo haga. cualquier trabajo durante la fase de cocción. Quiero evitar esos dos fragmentos complicados.
Peter Mounce
fuente
1
¿Ha verificado las opciones que net usertiene (p. Ej. /HOMEDIRO /PROFILEPATH)? . Ver net user /help. Desde mi entendimiento (no probado), puede crear un directorio para el usuario y configurarlo como homedir con el /HOMEDIRinterruptor.
Sven
¿Puedo preguntar qué caso de uso tiene que evite Active Directory? Las cosas serían mucho más fáciles con AD. Sólo curioso.
Ondrej Tucny
Estoy evitando AD porque las máquinas son efímeras; las vidas se miden en horas, no en días. Las máquinas albergan entornos de construcción de sala limpia. Hacer malabarismos con máquinas dentro y fuera de un AD a medida que van y vienen simplemente no vale la pena (vea también medium.com/palantir/active-directory-as-code-e9666a2e548d si está interesado en hacerlo).
Peter Mounce
@Sven sí, lamentablemente ninguno de los dos causa que se cree el perfil, incluso si establecen el camino.
Peter Mounce

Respuestas:

23

Windows puede crear un perfil de usuario a pedido, utilizando la API CreateProfile

Sin embargo, si no desea crear un ejecutable para realizar esta operación, puede llamar a la API en PowerShell. Otros ya lo han hecho: ejemplo en github .

Parte relevante del código:

$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;
}
Swisstone
fuente
Muchas gracias, esto funciona para mí. Nota para los demás: las funciones Register-NativeMethod y Add-NativeMethods están en la esencia vinculada.
Peter Mounce
17

Todo lo que necesita hacer es ejecutar un comando como ese usuario, Windows creará el perfil:

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

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

Greg Askew
fuente
1
Entonces, lo que está sucediendo aquí se psexec supone que debe conectarse a localhost con el nombre de usuario y la contraseña especificados con -uy -py lanzarse cmdsolo para salir de inmediato. Yo me perdí algo ? Esto suena algo contradictorio: conectarse al sistema con un nombre de usuario y contraseña inexistentes debería ser un error. Cómo funciona ?
Sergiy Kolodyazhnyy
1
@SergiyKolodyazhnyy: ¿Por qué crees que es un nombre de usuario y contraseña inexistentes? Es el mismo utilizado en la pregunta, obviamente como un ejemplo ...
Ben Voigt
1
@BenVoigt Bueno, me he perdido la parte superior de la pregunta. Pensé que OP también quería crear el usuario y eso es lo que se suponía que debía hacer esta respuesta. Entonces esa última parte del comentario es un malentendido.
Sergiy Kolodyazhnyy
@BenVoigt Aunque todavía tengo una pregunta. OP mencionó "No quiero crear C: \ users \ default". Entonces, ¿de dónde vendría el perfil del usuario cuando se usa este método y cómo Windows sabe crear directorios específicos preconfigurados si no es así C:\users\defaults?
Sergiy Kolodyazhnyy
1
@SergiyKolodyazhnyy: OP bastante seguro significa que no quiere personalizar C: \ Users \ Default ... no es que falte por completo. Windows creará el directorio de inicio C: \ Users \ foobar copiando de la vainilla simple C: \ Users \ default, luego, una vez que exista OP, puede aplicar su salsa especial a C: \ Users \ foobar donde no afectará a ningún otro usuarios.
Ben Voigt