Ich erstelle einen (lokalen) Benutzer, unter dem ein Windows-Dienst ausgeführt werden kann. Ich habe gute Gründe, warum ich NETWORK SERVICE, LOCAL SERVICE oder LOCAL SYSTEM nicht verwenden möchte.
Ich erstelle den Benutzer über net user foobar "Abcd123!" /add
- das funktioniert gut.
Zu diesem Zeitpunkt c:\users\foobar
existiert nicht.
Wenn ich das Home-Verzeichnis des Benutzers erstelle, bevor sich der Benutzer anmeldet (oder sachdienlicher) oder der Dienst, für den der Benutzer gestartet wird, erstellt Windows ein Benutzerprofil nebenan mit dem Namen c:\users\foobar-{gibberish/SID/whatever}
- dies ist kein vorhersehbarer Name.
Ich brauche das Home-Verzeichnis des Benutzers, um Dinge wie ein Verzeichnis zu enthalten .ssh
, a .gitconfig
- Tools wie dieses (nicht auf diese Tools beschränkt), die davon ausgehen, dass es sich um eine Person handelt, die sie verwendet, und so geht die Benutzerkonfiguration hinein ~/...
. Normalerweise Tools aus einem Unix-Erbe.
Aktuelle Frage
Gibt es also eine programmgesteuerte (vorzugsweise PowerShell- oder Standardbefehlszeile) Möglichkeit, Windows anzuweisen, das Benutzerprofil für einen lokalen Benutzer zu erstellen?
Oder andere Problemumgehungen?
Dinge, die ich noch nicht ausprobiert habe:
- Ein NSSM-Start / Pre-Hook, der Dateien von einer anderen Stelle in das Benutzerprofilverzeichnis kopiert, das hoffentlich zu diesem Zeitpunkt vorhanden ist, wenn Windows den Dienst startet, das Benutzerprofil erstellt und die Steuerung vor dem Start an den NSSM-Wrapper übergibt, der den Hook ausführt.
- Festlegen der Umgebungsvariablen USERPROFILE für den Dienst, die sich nicht im tatsächlichen Benutzerprofilverzeichnis befindet. Dies scheint mir gefährlich abseits der Piste, könnte aber auch gut funktionieren.
Anderer Kontext:
- Windows Server 2016, Desktop-Erfahrung.
- Core / Nano kann nicht verwendet werden.
- Es ist kein Active Directory im Spiel. Es wird nicht geben.
- Dies sind lokale Benutzer.
- Ich mache das über Ansible, das PowerShell unter der Haube für Windows-Dinge verwendet. Insbesondere das Modul win_user mit Ansible 2.7.5.
- Ich möchte kein
C:\users\default
(äquivalent zu/etc/skel
) erstellen , da es einige verschiedene Service-Benutzer gibt und eine Größe nicht für alle geeignet ist. Dies wirkt sich auch nicht darauf aus, wann das Benutzerprofil erstellt wird, sondern nur darauf, was darin enthalten ist, wenn es erstellt wird. - Ich verwende NSSM , um die Dienste zu verwalten.
Dinge, die ich versucht habe
- Starten des Dienstes und Zulassen, dass Windows das Verzeichnis erstellt
- Ich möchte dies nicht tun, da der Dienst vor dem Start Geheimnisse erfordert. Wenn ich dies also während des Image-Backvorgangs tue, muss ich sie bereinigen und sicherstellen, dass mein Dienst nicht funktioniert jegliche Arbeit während der Backphase. Ich möchte beides vermeiden.
quelle
net user
(zB/HOMEDIR
oder/PROFILEPATH
)? . Sehennet user /help
. Nach meinem (nicht getesteten) Verständnis können Sie ein Verzeichnis für den Benutzer erstellen und dieses mit dem/HOMEDIR
Schalter als homedir festlegen .Antworten:
Windows kann bei Bedarf mithilfe der CreateProfile- API ein Benutzerprofil erstellen
Wenn Sie jedoch keine ausführbare Datei erstellen möchten, um diesen Vorgang auszuführen, können Sie die API in PowerShell aufrufen. Andere haben es bereits getan: Beispiel auf Github .
Relevanter Teil des Codes:
quelle
Alles, was Sie tun müssen, ist einen Befehl als dieser Benutzer auszuführen, Windows wird das Profil erstellen:
psexec.exe -u foobar -p Abcd123! cmd.exe /c exit
https://docs.microsoft.com/en-us/sysinternals/downloads/psexec
quelle
psexec
soll sich mit localhost unter dem mit-u
und angegebenen Benutzernamen und Passwort verbinden-p
und startencmd
, um sofort zu beenden. Habe ich etwas vergessen ? Das klingt etwas unerklärlich - das Herstellen einer Verbindung zum System mit nicht vorhandenem Benutzernamen und Kennwort sollte ein Fehler sein. Wie funktioniert das ?C:\users\defaults
?