프로그래밍 방식으로 새 Windows 사용자 프로필을 만들려면 어떻게해야합니까?


20

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가 디렉토리를 작성하도록 허용
    • 서비스를 시작하기 전에 비밀이 필요하기 때문에 이렇게하고 싶지 않습니다. 따라서 이미지 베이킹 프로세스 에서이 작업을 수행하면 정리해야하며 서비스가 수행되지 않아야합니다. 베이킹 단계 중 모든 작업. 나는 그 불쌍한 두 가지를 피하고 싶다.

1
옵션 net user이 있는지 확인 했습니까 (예 : /HOMEDIR또는 /PROFILEPATH)? . 참조하십시오 net user /help. 내 (미숙 한) 이해에서 사용자의 디렉토리를 만들고 /HOMEDIR스위치를 사용하여 homedir로 설정할 수 있습니다.
Sven

Active Directory를 사용하지 않는 유스 케이스를 물어볼 수 있습니까? AD를 사용하면 훨씬 쉬울 것입니다. 그냥 궁금해서
Ondrej Tucny

기계가 일시적이기 때문에 AD를 피하고 있습니다. 수명은 일이 아닌 시간 단위로 측정됩니다. 머신은 클린 룸 빌드 환경을 호스팅합니다. 그들이 와서 이동은 단순히 가치가 없다로하고, AD 중 저글링 기계 (참조 medium.com/palantir/active-directory-as-code-e9666a2e548d을 당신이있는 거 관심이 그것을 할 경우).
Peter Mounce

@Sven yes-슬프게도 경로를 설정하더라도 프로파일 자체가 생성되지는 않습니다.
피터 Mounce

답변:


23

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;
}

대단히 감사합니다. 이것이 저에게 효과적입니다. 다른 사람들에게 참고-Register-NativeMethod 및 Add-NativeMethods 함수는 연결된 요지에 있습니다.
피터 Mounce

17

해당 사용자로서 명령을 실행하기 만하면 Windows가 프로파일을 작성합니다.

psexec.exe -u foobar -p Abcd123! cmd.exe /c exit

https://docs.microsoft.com/en-us/sysinternals/downloads/psexec


1
그래서 여기에 무슨 일이 일어나고 있는지 것은 psexec 사용자 이름과 암호를 지정에서 로컬 호스트에 연결되어 -u-p및 출시 cmd즉시 바로 종료합니다. 내가 뭘 그리워 했어? 이것은 직관적이지 않은 것처럼 들립니다. 존재하지 않는 사용자 이름과 비밀번호로 시스템에 연결하는 것은 오류가 발생합니다. 어떻게 작동합니까?
Sergiy Kolodyazhnyy

1
@ SergiyKolodyazhnyy : 왜 존재하지 않는 사용자 이름과 암호라고 생각하십니까? 그것은 질문으로 사용 된 것과 똑같습니다.
Ben Voigt

1
@ BenVoigt 글쎄, 나는 질문의 상단 부분을 놓쳤다. OP가 사용자를 만들고 싶었다고 생각했는데 이것이 바로 그 대답이었습니다. 따라서 주석의 마지막 부분은 오해입니다.
Sergiy Kolodyazhnyy

@BenVoigt 그래도 여전히 질문이 있습니다. OP는 "C : \ users \ default를 만들고 싶지 않습니다"라고 언급했습니다. 따라서이 방법을 사용할 때 사용자의 프로필은 어디에서 왔으며 Windows가 아닌 경우 사전 구성된 특정 디렉토리를 만드는 방법을 Windows는 어떻게 알 수 C:\users\defaults있습니까?
Sergiy Kolodyazhnyy

1
@ SergiyKolodyazhnyy : OP는 C : \ Users \ Default를 사용자 정의하고 싶지 않다는 것을 의미합니다 ... 완전히 사라지지는 않습니다. Windows는 일반 바닐라 C : \ Users \ default에서 복사하여 홈 디렉토리 C : \ Users \ foobar를 작성합니다. OP가 존재하면 OP는 자신의 특별한 소스를 C : \ Users \ foobar에 적용하여 다른 영향을 미치지 않습니다. 사용자.
Ben Voigt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.