首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何初始化Windows服务的新本地帐户?

如何初始化Windows服务的新本地帐户?
EN

Server Fault用户
提问于 2020-08-27 12:35:20
回答 1查看 505关注 0票数 1

我使用Terraform与Google一起创建2019主机,用于Jenkins。我希望安装一些软件,如Git、OpenJDK和其他使用铲子的软件,并将詹金斯特工罐作为运行在本地jenkins用户下的系统服务启动。

我使用通过metadata键(如sysprep-specialize-script-ps1windows-startup-script-ps1)提供的D3脚本来设置它们:

https://cloud.google.com/compute/docs/startupscript#providing_一个_启动_脚本_为_视窗_实例

我的问题是,我使用Powershell创建本地用户,如下所示:

代码语言:javascript
复制
New-LocalUser -Name $Username `
    -Description $Description `
    -Password $Password `
    -PasswordNeverExpires `
    -AccountNeverExpires

我使用Windows创建一个Jenkins服务:https://github.com/winsw/winsw

但是,当我尝试在没有登录到Jenkins用户的情况下运行它时,我会返回:

代码语言:javascript
复制
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-ProcessInvoke-Command或带有-Credential标志的Start-Job之类的命令作为jenkins用户运行命令的原因。

我在试图以jenkins用户身份运行命令或只运行D18时遇到了问题,如下所示:

代码语言:javascript
复制
[localhost] The background process reported an error with the following message: .
    + CategoryInfo          : OpenError: (localhost:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : 2100,PSSessionStateBroken

我做错了什么?

有什么更好的方法来实现我想做的事吗?

如何使用的配置文件创建本地用户<#>,以便启动我创建的服务?

EN

回答 1

Server Fault用户

发布于 2020-11-27 13:09:40

关于链接问题的答复,<#>Based有三种方式(看起来最有希望):

  1. 使用CreateProfile API
  2. 使用Powershell作为在这个答案中描述 -您将找到GitHub上的实例 -在本例中,您将能够定义主目录路径。定义配置文件路径的代码的一部分:
代码语言:javascript
复制
    $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. 使用psexec实用程序,这看起来像一个直接的方法,但我不确定它是否会Ansible。psexec.exe -u foobar -p Abcd123! cmd.exe /c exit,这是更多关于psexec工具。
票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1031731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档