我使用Terraform与Google一起创建2019主机,用于Jenkins。我希望安装一些软件,如Git、OpenJDK和其他使用铲子的软件,并将詹金斯特工罐作为运行在本地jenkins用户下的系统服务启动。
我使用通过metadata键(如sysprep-specialize-script-ps1和windows-startup-script-ps1)提供的D3脚本来设置它们:
https://cloud.google.com/compute/docs/startupscript#providing_一个_启动_脚本_为_视窗_实例
我的问题是,我使用Powershell创建本地用户,如下所示:
New-LocalUser -Name $Username `
-Description $Description `
-Password $Password `
-PasswordNeverExpires `
-AccountNeverExpires我使用Windows创建一个Jenkins服务:https://github.com/winsw/winsw
但是,当我尝试在没有登录到Jenkins用户的情况下运行它时,我会返回:
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.g__Start|2_2(<>c__DisplayClass2_0& )
at WinSW.Program.Run(String[] argsArray, IWinSWConfiguration descriptor)
at WinSW.Program.Main(String[] args)如果我首先使用RDP登录到jenkins用户,这将在第一次登录时创建用户配置文件,则不会发生此问题。我想这就是允许服务正确启动的原因。
我试图弄清楚如何创建一个用户和他们的配置文件,而不必手动登录到该用户,这样服务就可以正确启动。安装和启动PS脚本以SYSTEM用户的身份运行,这可能是使用Start-Process、Invoke-Command或带有-Credential标志的Start-Job之类的命令作为jenkins用户运行命令的原因。
我在试图以jenkins用户身份运行命令或只运行D18时遇到了问题,如下所示:
[localhost] The background process reported an error with the following message: .
+ CategoryInfo : OpenError: (localhost:String) [], PSRemotingTransportException
+ FullyQualifiedErrorId : 2100,PSSessionStateBroken我做错了什么?
有什么更好的方法来实现我想做的事吗?
如何使用的配置文件创建本地用户<#>,以便启动我创建的服务?
发布于 2020-11-27 13:09:40
关于链接问题的答复,<#>Based有三种方式(看起来最有希望):
$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;
}psexec实用程序,这看起来像一个直接的方法,但我不确定它是否会Ansible。psexec.exe -u foobar -p Abcd123! cmd.exe /c exit,这是更多关于psexec工具。https://serverfault.com/questions/1031731
复制相似问题