¿Cómo debo inicializar una nueva cuenta local para un servicio de Windows?

¿Cómo debo inicializar una nueva cuenta local para un servicio de Windows?

Estoy usando Terraform con Google Cloud para crear hosts de Windows Server Core 2019 para usar con Jenkins. Quiero instalar algún software como Git, OpenJDK y otros usandoCucharón, y comenzar elJarra del agente Jenkinscomo un servicio del sistema que se ejecuta bajo un jenkinsusuario local.

Los estoy configurando usando scripts de PowerShell proporcionados mediante metadataclaves como sysprep-specialize-script-ps1y windows-startup-script-ps1:

https://cloud.google.com/compute/docs/startupscript#providing_a_startup_script_for_windows_instances

Mi problema es que estoy creando usuarios locales usando Powershell de esta manera:

New-LocalUser -Name $Username `
    -Description $Description `
    -Password $Password `
    -PasswordNeverExpires `
    -AccountNeverExpires

Y creo un servicio del Agente Jenkins usando Windows Service Wrapper: https://github.com/winsw/winsw

Pero cuando intento ejecutarlo sin iniciar sesión primero en el usuario de Jenkins, obtengo lo siguiente:

2020-08-26 14:49:57,760 INFO  - Starting the service with id 'JenkinsAgent'
2020-08-26 14:49:57,823 FATAL - WMI Operation failure: ServiceLogonFailure
WMI.WmiException: ServiceLogonFailure
   at WMI.WmiRoot.BaseHandler.CheckError(ManagementBaseObject result)
   at WMI.WmiRoot.InstanceHandler.Invoke(Object proxy, MethodInfo method, Object[] arguments)
   at WinSW.Program.<Run>g__Start|2_2(<>c__DisplayClass2_0& )
   at WinSW.Program.Run(String[] argsArray, IWinSWConfiguration descriptor)
   at WinSW.Program.Main(String[] args)

Este problema no ocurre si inicio sesión por primera vez con el jenkinsusuario mediante RDP, que crea el perfil de usuario en el primer inicio de sesión. Supongo que eso es lo que permite que el servicio se inicie correctamente.

Estoy tratando de descubrir cómo puedo crear un usuario y su perfil sin tener que iniciar sesión manualmente en ese usuario para que el servicio pueda iniciarse correctamente. Los scripts de configuración e inicio de PS se ejecutan como SYSTEMusuario, lo que podría ser la razón por la cual falla el uso de algo como Start-Process, Invoke-Commando Start-Jobcon -Credentialbandera para ejecutar un comando como jenkinsusuario para permitir que se cree su perfil.

He tenido problemas al intentar ejecutar un comando o simplemente exitcomo jenkinsusuario así:

[localhost] The background process reported an error with the following message: .
    + CategoryInfo          : OpenError: (localhost:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : 2100,PSSessionStateBroken

¿Qué estoy haciendo mal?

¿Existe alguna manera mejor de lograr lo que estoy tratando de hacer?

¿Cómo puedo crear un usuario local?consu perfil para que se inicie el servicio que creo?

Respuesta1

Basado en respuestas de una pregunta vinculadaHay tres formas (que parecen más prometedoras):

  1. UsarCrear perfil API

  2. Usar Powershell comodescrito en esta respuesta- usted encontraráejemplo en GitHub- en este caso podrá definir la ruta del directorio de inicio. Parte del código que define la ruta del perfil:

    $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;
    }
  1. Usar psexecutilidad Este parece un método sencillo, pero no estoy seguro de si será Ansible. psexec.exe -u foobar -p Abcd123! cmd.exe /c exit Aquí estámás información sobrepsexecherramienta.

información relacionada