Windows 서비스에 대한 새 로컬 계정을 어떻게 초기화해야 합니까?

Windows 서비스에 대한 새 로컬 계정을 어떻게 초기화해야 합니까?

저는 Google Cloud와 함께 Terraform을 사용하여 Jenkins와 함께 사용할 Windows Server Core 2019 호스트를 만들고 있습니다. Git, OpenJDK 등과 같은 소프트웨어를 설치하고 싶습니다.국자, 그리고 시작젠킨스 에이전트 JAR로컬 사용자로 실행되는 시스템 서비스로 jenkins.

다음 과 metadata같은 키를 통해 제공되는 PowerShell 스크립트를 사용하여 설정하고 있습니다 .sysprep-specialize-script-ps1windows-startup-script-ps1

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

내 문제는 다음과 같이 Powershell을 사용하여 로컬 사용자를 생성한다는 것입니다.

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

그리고 Windows Service Wrapper를 사용하여 Jenkins Agent 서비스를 만듭니다. 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.<Run>g__Start|2_2(<>c__DisplayClass2_0& )
   at WinSW.Program.Run(String[] argsArray, IWinSWConfiguration descriptor)
   at WinSW.Program.Main(String[] args)

jenkins처음 로그인할 때 사용자 프로필을 생성하는 RDP를 사용하여 사용자 에 처음 로그인하면 이 문제가 발생하지 않습니다 . 이것이 서비스가 올바르게 시작될 수 있다고 가정합니다.

서비스가 올바르게 시작될 수 있도록 해당 사용자에 수동으로 로그인하지 않고도 사용자와 해당 프로필을 생성할 수 있는 방법을 찾으려고 노력 중입니다. 설정 및 시작 PS 스크립트가 사용자로 실행 중입니다 . 이는 , 또는 플래그 와 같은 것을 사용하여 프로필을 생성할 수 있도록 사용자 로 명령을 실행하는 데 실패하는 SYSTEM이유일 수 있습니다 .Start-ProcessInvoke-CommandStart-Job-Credentialjenkins

명령을 실행하려고 하거나 다음과 같은 사용자 exit로서 문제가 발생했습니다 .jenkins

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

내가 도대체 ​​뭘 잘못하고있는 겁니까?

내가하려는 일을 달성하는 더 좋은 방법이 있습니까?

로컬 사용자를 어떻게 생성하나요?~와 함께내가 만든 서비스가 시작되도록 프로필을 설정하시겠습니까?

답변1

연결된 질문의 답변을 기반으로 함세 가지 방법이 있습니다(가장 유망해 보입니다).

  1. 사용프로필 생성 API

  2. Powershell을 다음으로 사용이 답변에 설명되어 있습니다- 당신은 발견 할 것이다GitHub의 예- 이 경우 홈 디렉터리 경로를 정의할 수 있습니다. 프로필 경로를 정의하는 코드 부분:

    $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도구.

관련 정보