Programlı olarak yeni bir Windows kullanıcı profilinin oluşturulmasına nasıl neden olabilirim?


20

Bir Windows hizmetinin çalışması için (yerel) bir kullanıcı oluşturuyorum. AĞ HİZMETİ, YEREL HİZMET veya YEREL SİSTEM'i kullanmak istememek için iyi nedenlerim var.

Ben kullanıcı üzerinden oluşturmak net user foobar "Abcd123!" /add- bu iyi çalışıyor.

Bu noktada c:\users\foobaryok.

Eğer ben hem de kullanıcı günlükleri (veya daha önemlisi) veya kullanıcı başlar yukarı için olduğuna servisten önce kullanıcının ana dizini oluşturmak denilen kapı yanındaki Windows kullanıcı profil oluşturur c:\users\foobar-{gibberish/SID/whatever}bu öngörülebilir bir isim değil -.

Kullanıcının ana dizini bir .sshdizin, bir şey gibi .gitconfigbu araçları (bu araçlarla sınırlı değildir) bunları kullanan bir kişi olacağı varsayımları yapmak ve böylece kullanıcı yapılandırma içeriyor ~/.... Genellikle, bir Unix mirasından araçlar.

Gerçek soru

Peki - Windows'a yerel bir kullanıcı için kullanıcı profilini oluşturmasını söylemenin programlı (tercihen PowerShell veya kullanıma hazır komut satırı) yolu var mı?

Veya başka bir geçici çözüm var mı?

Henüz denemediğim şeyler:

  • Bir NSSM başlat / ön kanca başka bir yerde o kullanıcı profili dizine kopyalar dosyaları umarım sayesinde bu noktada var Windows'un devreye almadan önce kancayı çalışan sarıcı sonra NSSM için teslim kontrolünü kullanıcı profili oluşturarak, hizmet başlangıç.
  • Hizmetin USERPROFILE ortam değişkenini, gerçek kullanıcı profili dizininden başka bir yerde olacak şekilde ayarlama. Bu beni tehlikeli bir şekilde devreden çıkarıyor ama aynı zamanda işe yarayabilir.

Diğer bağlam:

  • Windows Server 2016, masaüstü deneyimi.
    • Core / Nano kullanılamıyor.
  • Oyunda aktif bir dizin yok. Olmayacak.
  • Bunlar yerel kullanıcılar.
  • Bunu Windows şeyler için kaputun altında PowerShell kullanan Ansible üzerinden yapıyorum. Özellikle winible kullanıcı modülü, Ansible 2.7.5 ile.
  • Bir C:\users\default(eşdeğer /etc/skel) oluşturmak istemiyorum , çünkü birkaç farklı hizmet kullanıcısı var ve bir boyut hepsine uymuyor. Bu, kullanıcı profilinin ne zaman oluşturulduğunu da etkilemez, sadece olduğunda ne olacağını etkiler.
  • Hizmetleri yönetmek için NSSM kullanıyorum .

Denediğim şeyler

  • hizmeti başlatma ve Windows'un dizini oluşturmasına izin verme
    • Bunu yapmak istemiyorum, çünkü hizmet başlamadan önce sır gerektiriyor ve bu yüzden bunu görüntü pişirme sürecimde yaparsam, onları temizlemem ve ayrıca servisimin yapmadığından emin olmalıyım pişirme aşamasında herhangi bir çalışma. Bu iki bitten de kaçınmak istiyorum.

1
Seçeneklerin net user(ör. /HOMEDIRVeya /PROFILEPATH) olduğunu kontrol ettiniz mi? . Bkz net user /help. (Test edilmemiş) anlayışımdan, kullanıcı için bir dizin oluşturabilir ve bunu /HOMEDIRanahtarla homedir olarak ayarlayabilirsiniz .
Sven

Active Directory'den kaçınan hangi kullanım durumunuz olduğunu sorabilir miyim? AD ile işler çok daha kolay olurdu. Sadece merak.
Ondrej Tucny

AD'den kaçıyorum çünkü makineler geçici; yaşam süreleri gün değil saat olarak ölçülür. Makineler temiz oda inşa ortamlarına ev sahipliği yapıyor. Gelip gittikçe bir AD'nin içine ve dışına hokkabazlık yapmak sadece buna değmez (ayrıca bkz. Medium.com/palantir/active-directory-as-code-e9666a2e548d yapmak istiyorsanız).
Peter Mounce

@ Evet bile - ne yazık ki bunların hiçbiri yolu oluştursalar bile profilin kendisinin oluşturulmasına neden olmaz.
Peter Mounce

Yanıtlar:


23

Windows, CreateProfile API'sini kullanarak istek üzerine bir kullanıcı profili oluşturabilir

Ancak, bu işlemi gerçekleştirmek için bir yürütülebilir dosya oluşturmak istemiyorsanız, PowerShell'de API'yi çağırabilirsiniz. Diğerleri bunu zaten yaptı: github örneği .

Kodun ilgili kısmı:

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

Çok teşekkür ederim, bu benim için işe yarıyor. Diğerlerine not - Register-NativeMethod ve Add-NativeMethods işlevleri bağlantılı özdedir.
Peter Mounce

17

Tek yapmanız gereken o kullanıcı olarak bir komut çalıştırmak, Windows profili oluşturacak:

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

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


1
Yani burada neler olup psexec adı ve şifre ile belirtilen altında localhost bağlanmak gerekiyordu -uve -pve lansmandan cmdhemen hemen çıkmak için. Bir şey mi kaçırdım ? Bu biraz mantıksız gelebilir - mevcut olmayan kullanıcı adı ve şifre ile sisteme bağlanmak bir hata olmalıdır. Bu nasıl çalışıyor ?
Sergiy Kolodyazhnyy

1
@SergiyKolodyazhnyy: Bunun neden var olmayan bir kullanıcı adı ve şifre olduğunu düşünüyorsun?
Ben Voigt

1
@BenVoigt Sorunun üst kısmını kaçırdım. OP'nin kullanıcıyı da oluşturmak istediğini düşündüm ve bu cevabın yapması gerekiyordu. Bu yüzden yorumun son kısmı bir yanlış anlamadır.
Sergiy Kolodyazhnyy

@BenVoigt Yine de bir sorum var. OP, "C: \ users \ default oluşturmak istemiyorum" ifadesini kullandı. Peki bu yöntem kullanıldığında kullanıcının profili nereden gelir ve Windows, önceden yapılandırılmamışsa önceden yapılandırılmış belirli dizinleri nasıl oluşturabilir C:\users\defaults?
Sergiy Kolodyazhnyy

1
@SergiyKolodyazhnyy: OP'nin C: \ Users \ Default ... 'u özelleştirmek istemediği anlamına geleceğinden eminim ... tamamen eksik olmayacak. Windows, C: \ Users \ foobar giriş dizinini düz vanilya C: \ Users \ varsayılanından kopyalayarak oluşturacaktır, daha sonra OP, özel sosu C: \ Users \ foobar'a uygulayabilir. kullanıcılar.
Ben Voigt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.