Windows 서비스를 실행할 (로컬) 사용자를 만들고 있습니다. NETWORK SERVICE, LOCAL SERVICE 또는 LOCAL SYSTEM을 사용하고 싶지 않은 이유가 있습니다.
나는 통해 사용자를 만듭니다 net user foobar "Abcd123!" /add
-이것은 잘 작동합니다.
현재 c:\users\foobar
존재하지 않습니다.
경우 나 사용자 중 로그에 대한 (또는, 더 pertinently) 또는 사용자가 시작 업에 대한 것을 서비스하기 전에, 사용자의 홈 디렉토리를 만들라고 문 옆에, 윈도우는 사용자 프로파일을 작성 c:\users\foobar-{gibberish/SID/whatever}
이 예측 가능한 이름이 아닙니다 -.
나는 같은 것들을 포함하는 사용자의 홈 디렉토리가 필요 .ssh
디렉토리를하는 .gitconfig
– 그것은 그들을 사용하는 사람과 사용자 구성 있도록있을거야 가정을 (되지 않은 도구에 한함) 같은 도구는 내부 간다 ~/...
. 일반적으로 유닉스 유산의 도구.
실제 질문
따라서 Windows에 로컬 사용자에 대한 사용자 프로필을 만들도록 지시하는 프로그래밍 방식 (바람직하게는 PowerShell 또는 기본 제공 명령 줄)이 있습니까?
아니면 다른 해결 방법이 있습니까?
아직 시도하지 않은 것들 :
- NSSM 시작 / 사전 훅이 다른 곳에서하는 사용자 프로파일 디렉토리에에서 파일을 복사 희망이 의 미덕이 시점에 존재하는 윈도우 시작 전에 훅을 실행 랩퍼 다음 NSSM로 나눠 제어를 사용자 프로파일을 생성, 서비스를 시작하기는.
- 서비스의 USERPROFILE 환경 변수를 실제 사용자 프로파일 디렉토리 이외의 위치로 설정 이로 인해 위험한 오프 피스트가되었지만 잘 작동 할 수도 있습니다.
다른 상황 :
- Windows Server 2016, 데스크톱 경험.
- Core / Nano를 사용할 수 없습니다.
- 활성 디렉토리가 없습니다. 없을 것입니다.
- 이들은 로컬 사용자입니다.
- Windows 용 후드 아래에서 PowerShell을 사용하는 Ansible을 통해이 작업을 수행하고 있습니다. 특히 Ansible 2.7.5 가 포함 된 win_user 모듈.
- 몇 가지 다른 서비스 사용자가 있고 하나의 크기가 모두 맞지 않기 때문에
C:\users\default
(와 동등한/etc/skel
) 을 만들고 싶지 않습니다. 이것은 또한 사용자 프로필이 생성 될 때 영향을 미치지 않으며 생성 될 때 그 프로파일에 영향을 미칩니다. - 내가 사용하고 NSSM를 서비스를 관리 할 수 있습니다.
내가 시도한 것
- 서비스를 시작하고 Windows가 디렉토리를 작성하도록 허용
- 서비스를 시작하기 전에 비밀이 필요하기 때문에 이렇게하고 싶지 않습니다. 따라서 이미지 베이킹 프로세스 에서이 작업을 수행하면 정리해야하며 서비스가 수행되지 않아야합니다. 베이킹 단계 중 모든 작업. 나는 그 불쌍한 두 가지를 피하고 싶다.
답변
Windows는 CreateProfile API를 사용하여 주문형 사용자 프로파일을 작성할 수 있습니다.
그러나이 작업을 수행하기 위해 실행 파일을 만들지 않으려는 경우 PowerShell에서 API를 호출 할 수 있습니다. 다른 사람들은 이미 그것을 수행했습니다 : 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;
}
답변
해당 사용자로서 명령을 실행하기 만하면 Windows가 프로파일을 작성합니다.
psexec.exe -u foobar -p Abcd123! cmd.exe /c exit
https://docs.microsoft.com/en-us/sysinternals/downloads/psexec