Bagaimana saya secara terprogram dapat menyebabkan profil pengguna Windows baru dibuat?

20

Saya membuat pengguna (lokal) untuk menjalankan layanan Windows sebagai. Saya punya alasan bagus untuk tidak ingin menggunakan LAYANAN JARINGAN, LAYANAN LOKAL, atau SISTEM LOKAL.

Saya membuat pengguna melalui net user foobar "Abcd123!" /add- ini berfungsi dengan baik.

Pada titik ini, c:\users\foobartidak ada.

Jika saya membuat direktori home pengguna, sebelum pengguna masuk (atau, lebih tepatnya) atau layanan yang digunakan pengguna untuk memulai, Windows membuat profil pengguna di sebelah yang disebut c:\users\foobar-{gibberish/SID/whatever}- ini bukan nama yang dapat diprediksi.

Saya memerlukan direktori home pengguna untuk memuat hal-hal seperti .sshdirektori, a .gitconfig- tools seperti itu (tidak terbatas pada tools itu) yang membuat asumsi bahwa itu akan menjadi orang yang menggunakannya, dan konfigurasi pengguna masuk ke dalam ~/.... Biasanya, alat dari warisan Unix.

Pertanyaan aktual

Jadi - apakah ada cara terprogram (lebih disukai, PowerShell, atau out-of-the-box) untuk memberitahu Windows untuk membuat profil pengguna untuk pengguna lokal?

Atau, ada solusi lain?

Hal-hal yang belum pernah saya coba:

  • NSSM start / pre hook yang menyalin file dari tempat lain ke direktori profil pengguna yang diharapkan ada pada saat ini berdasarkan Windows memulai layanan, membuat profil pengguna kemudian menyerahkan kontrol ke pembungkus NSSM yang menjalankan hook sebelum memulai.
  • Mengatur variabel lingkungan USERPROFILE untuk layanan berada di tempat lain selain direktori profil pengguna yang sebenarnya. Ini menurut saya sebagai off-piste yang berbahaya tetapi juga bisa bekerja dengan baik.

Konteks lain:

  • Windows Server 2016, pengalaman desktop.
    • Tidak dapat menggunakan Core / Nano.
  • Tidak ada direktori aktif yang sedang dimainkan. Tidak akan ada.
  • Ini adalah pengguna lokal.
  • Saya melakukan ini melalui Ansible, yang menggunakan PowerShell di bawah tenda untuk hal-hal Windows. Khususnya modul win_user , dengan Ansible 2.7.5.
  • Saya tidak ingin membuat C:\users\default(yang setara dengan /etc/skel), karena ada beberapa pengguna layanan yang berbeda dan satu ukuran tidak cocok untuk semua. Ini juga tidak mempengaruhi ketika profil pengguna dibuat, hanya apa yang akan ada di dalamnya ketika itu.
  • Saya menggunakan NSSM untuk mengelola layanan.

Hal yang sudah saya coba

  • memulai layanan dan memungkinkan Windows untuk membuat direktori
    • Saya tidak ingin melakukan ini, karena layanan ini membutuhkan rahasia sebelum memulai, dan jadi jika saya melakukan ini di dalam proses pembuatan gambar saya maka saya perlu membersihkannya, dan juga memastikan layanan saya tidak melakukan pekerjaan apa pun selama fase memanggang. Saya ingin menghindari kedua bit fiddly itu.
Peter Mounce
sumber
1
Sudahkah Anda memeriksa opsi yang net userdimiliki (mis. /HOMEDIRAtau /PROFILEPATH)? . Lihat net user /help. Dari pemahaman saya (yang belum diuji), Anda dapat membuat direktori untuk pengguna, dan mengatur ini sebagai homedir dengan /HOMEDIRsakelar.
Sven
Bolehkah saya bertanya use case apa yang Anda miliki untuk menghindari Active Directory? Banyak hal akan lebih mudah dengan AD. Hanya penasaran.
Ondrej Tucny
Saya menghindari AD karena mesin itu fana; masa hidup diukur dalam satuan jam, bukan hari. Mesin-mesin ini menampung lingkungan bangunan yang bersih. Mesin juggling masuk dan keluar dari AD saat mereka datang dan pergi sama sekali tidak layak (lihat juga media.com/palantir/active-directory-as-code-e9666a2e548d jika Anda tertarik untuk melakukannya).
Peter Mounce
@ Bahkan ya - sayangnya tidak ada yang menyebabkan profil itu sendiri dibuat, bahkan jika mereka menetapkan path.
Peter Mounce

Jawaban:

23

Windows dapat membuat profil pengguna sesuai permintaan, menggunakan API CreateProfile

Namun, jika tidak ingin membuat yang dapat dieksekusi untuk melakukan operasi ini, Anda dapat memanggil API di PowerShell. Yang lain sudah melakukannya: contoh di github .

Bagian yang relevan dari kode:

$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;
}
Batu Swis
sumber
Terima kasih banyak, ini berhasil untuk saya. Catatan untuk orang lain - fungsi Register-NativeMethod dan Add-NativeMethods ada di intisari tertaut.
Peter Mounce
17

Yang perlu Anda lakukan adalah menjalankan perintah sebagai pengguna itu, Windows akan membuat profil:

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

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

Greg Askew
sumber
1
Jadi apa yang terjadi di sini psexec seharusnya terhubung ke localhost di bawah nama pengguna dan kata sandi yang ditentukan dengan -udan -pdan diluncurkan cmdhanya untuk segera keluar. Apakah saya melewatkan sesuatu? Ini terdengar agak berlawanan dengan intuisi - menghubungkan ke sistem dengan nama pengguna dan kata sandi yang tidak ada seharusnya merupakan kesalahan. Bagaimana cara kerjanya ?
Sergiy Kolodyazhnyy
1
@SergiyKolodyazhnyy: Mengapa Anda pikir itu tidak ada nama pengguna dan kata sandi? Itu sama dengan yang digunakan dalam pertanyaan, jelas sebagai contoh ...
Ben Voigt
1
@ BenVoigt Yah, saya melewatkan bagian atas pertanyaan. Saya pikir OP ingin membuat pengguna juga dan itulah yang seharusnya dilakukan oleh jawaban ini. Sehingga bagian terakhir dari komentar adalah kesalahpahaman.
Sergiy Kolodyazhnyy
@ BenVoigt Meskipun saya masih memiliki pertanyaan. OP menyebutkan "Saya tidak ingin membuat C: \ users \ default". Jadi dari mana profil pengguna berasal ketika metode ini digunakan dan bagaimana Windows tahu untuk membuat direktori pra-konfigurasi khusus jika bukan dari C:\users\defaults?
Sergiy Kolodyazhnyy
1
@SergiyKolodyazhnyy: Cukup yakin OP berarti dia tidak ingin mengkustomisasi C: \ Users \ Default ... bukan berarti itu akan sepenuhnya hilang. Windows akan membuat direktori home C: \ Users \ foobar dengan menyalin dari vanilla polos C: \ Users \ default, lalu begitu OP ada, dapat menerapkan saus spesialnya ke C: \ Users \ foobar di mana itu tidak akan mempengaruhi yang lain pengguna.
Ben Voigt