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 jenkins
usuario local.
Los estoy configurando usando scripts de PowerShell proporcionados mediante metadata
claves como sysprep-specialize-script-ps1
y 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 jenkins
usuario 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 SYSTEM
usuario, lo que podría ser la razón por la cual falla el uso de algo como Start-Process
, Invoke-Command
o Start-Job
con -Credential
bandera para ejecutar un comando como jenkins
usuario para permitir que se cree su perfil.
He tenido problemas al intentar ejecutar un comando o simplemente exit
como jenkins
usuario 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):
UsarCrear perfil API
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;
}
- Usar
psexec
utilidad 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 sobrepsexec
herramienta.