Jak mogę programowo spowodować utworzenie nowego profilu użytkownika Windows?

20

Tworzę (lokalnego) użytkownika, aby usługa Windows mogła działać jako. Mam dobre powody, dla których nie chcę korzystać z USŁUGI SIECIOWEJ, USŁUGI LOKALNEJ lub SYSTEMU LOKALNEGO.

Tworzę użytkownika przez net user foobar "Abcd123!" /add- to działa dobrze.

W tym momencie c:\users\foobarnie istnieje.

Jeśli mogę tworzyć katalog domowy użytkownika, zanim użytkownik obu loguje (lub bardziej trafnie) lub usługi, które użytkownik jest na uruchomieniu systemu Windows tworzy obsługi profil sąsiedni nazywa c:\users\foobar-{gibberish/SID/whatever}- to nie jest przewidywalny imię.

Potrzebuję, aby katalog domowy użytkownika zawierał takie rzeczy jak .sshkatalog, a .gitconfig- takie narzędzia (nie tylko te narzędzia), które zakładają, że będzie to osoba korzystająca z nich, więc konfiguracja użytkownika wchodzi do środka ~/.... Zwykle narzędzia z dziedzictwa uniksowego.

Rzeczywiste pytanie

Więc - czy istnieje programowy (najlepiej PowerShell lub gotowy do użycia wiersz poleceń) sposób, aby poinformować system Windows o utworzeniu profilu użytkownika dla użytkownika lokalnego?

Lub jakieś inne obejścia?

Rzeczy, których jeszcze próbowałem:

  • Hak uruchamiania / wstępnego NSSM, który kopiuje pliki z innego miejsca do katalogu profilu użytkownika, który, mam nadzieję, istnieje w tym momencie dzięki systemowi Windows uruchamiającemu usługę, tworząc profil użytkownika, a następnie przekazując kontrolę do opakowania NSSM uruchamiającego hak przed uruchomieniem.
  • Ustawienie zmiennej środowiskowej USERPROFILE, aby usługa znajdowała się w innym miejscu niż rzeczywisty katalog profilu użytkownika. To wydaje mi się niebezpieczne poza trasą, ale może też działać dobrze.

Inny kontekst:

  • Windows Server 2016, środowisko pulpitu.
    • Nie można użyć Core / Nano.
  • W grze nie ma aktywnego katalogu. Nie będzie
  • To są lokalni użytkownicy.
  • Robię to za pośrednictwem Ansible, który używa PowerShell pod maską dla Windows. W szczególności, win_user moduł z ansibl 2.7.5.
  • Nie chcę tworzyć C:\users\default(odpowiednika /etc/skel), ponieważ istnieje kilku różnych użytkowników usług, a jeden rozmiar nie pasuje do wszystkich. Nie ma to również wpływu na tworzenie profilu użytkownika, tylko na to, co będzie w nim, gdy będzie.
  • Korzystam z NSSM do zarządzania usługami.

Rzeczy, których próbowałem

  • uruchomienie usługi i umożliwienie Windowsowi utworzenia katalogu
    • Nie chcę tego robić, ponieważ usługa wymaga tajemnic przed uruchomieniem, więc jeśli zrobię to w procesie tworzenia obrazu, będę musiał je wyczyścić, a także upewnić się, że moja usługa nie robi dowolna praca podczas fazy pieczenia. Chcę uniknąć obu tych dziwacznych kawałków.
Peter Mounce
źródło
1
Czy sprawdziłeś, czy opcje net userma (np. /HOMEDIRLub /PROFILEPATH)? . Zobaczyć net user /help. Z mojego (nieprzetestowanego) zrozumienia możesz utworzyć katalog dla użytkownika i ustawić go jako homedir za pomocą /HOMEDIRprzełącznika.
Sven
Czy mogę zapytać, jaki masz przykład zastosowania, który pozwala uniknąć usługi Active Directory? Z AD byłoby znacznie łatwiej. Po prostu ciekawy.
Ondrej Tucny
Unikam AD, ponieważ maszyny są efemeryczne; czasy życia mierzone są w godzinach, a nie dniach. Maszyny obsługują środowiska kompilacji w pomieszczeniach czystych. Żonglowanie maszynami w AD, gdy przychodzą i wychodzą, po prostu nie jest tego warte (zobacz także medium.com/palantir/active-directory-as-code-e9666a2e548d, jeśli chcesz to zrobić).
Peter Mounce
@Nawet tak - niestety żadna z nich nie powoduje utworzenia samego profilu, nawet jeśli wyznaczają ścieżkę.
Peter Mounce

Odpowiedzi:

23

System Windows może utworzyć profil użytkownika na żądanie przy użyciu interfejsu API CreateProfile

Jeśli jednak nie chcesz utworzyć pliku wykonywalnego do wykonania tej operacji, możesz wywołać interfejs API w programie PowerShell. Inni już to zrobili: przykład na github .

Odpowiednia część kodu:

$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;
}
Swisstone
źródło
Dziękuję bardzo, to działa dla mnie. Uwaga dla innych - funkcje Register-NativeMethod i Add-NativeMethods znajdują się w połączonej liście.
Peter Mounce
17

Wszystko, co musisz zrobić, to uruchomić polecenie jako ten użytkownik, system Windows utworzy profil:

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

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

Greg Askew
źródło
1
Więc to, co się tutaj dzieje, psexec ma połączyć się z hostem lokalnym pod nazwą użytkownika i hasłem określonym za pomocą -ui -pi uruchomić, cmdaby natychmiast wyjść. Czy coś przegapiłem ? Brzmi to nieco sprzecznie z intuicją - połączenie z systemem z nieistniejącą nazwą użytkownika i hasłem powinno być błędem. Jak to działa ?
Sergiy Kolodyazhnyy
1
@SergiyKolodyazhnyy: Jak myślisz, dlaczego to nieistniejąca nazwa użytkownika i hasło? Jest to ten sam, którego użyto w pytaniu, oczywiście jako przykład ...
Ben Voigt,
1
@BenVoigt Cóż, brakowało mi górnej części pytania. Myślałem, że OP chciał również utworzyć użytkownika i właśnie to miała zrobić ta odpowiedź. Ta ostatnia część komentarza jest nieporozumieniem.
Sergiy Kolodyazhnyy
@BenVoigt Chociaż wciąż mam pytanie. OP wspomniał „Nie chcę tworzyć C: \ users \ default”. Skąd więc wziąłby się profil użytkownika, gdy ta metoda jest używana, i skąd Windows wiedziałby, jak tworzyć określone wstępnie skonfigurowane katalogi, gdyby nie z C:\users\defaults?
Sergiy Kolodyazhnyy
1
@SergiyKolodyazhnyy: Dość pewny, że OP oznacza, że ​​nie chce dostosowywać C: \ Users \ Default ... nie, że będzie całkowicie brakować. Windows utworzy katalog domowy C: \ Users \ foobar, kopiując ze zwykłej wanilii C: \ Users \ default, a następnie, gdy już istnieje, OP może zastosować swój specjalny sos do C: \ Users \ foobar, gdzie nie wpłynie to na żaden inny użytkownicy.
Ben Voigt