Ich habe eine .NET-ausführbare Datei (die ich erstellt habe), die MicrosoftsActive Directory-Dienstschnittstellen(über System.DirectoryServices.AccountManagement), um LDAP-Abfragen durchzuführen. Intern zu ADSI,Es lädt das Active Directory-Schema herunter und speichert es lokal. Dieses Schema soll in einem Ordner unter gespeichert werden %LOCALAPPDATA%\Microsoft\Windows\SchCache\
.
Wenn ich diese ausführbare Datei einplane inAufgabenplanungauf Windows Server 2012 R2 und richten Sie es so ein, dass es als „UserA“ ausgeführt wirdauch wenn der Benutzer nicht angemeldet ist, das Programm läuft, aber es versucht, die obige Cache-Datei in eineOrdner mit dem wörtlichen Namen%LOCALAPPDATA%\Microsoft\Windows\SchCache\
innerhalb derstartet inOrdner der geplanten Aufgabe (der absichtlich auf den Ordner meiner ausführbaren Datei eingestellt ist). Mit anderen Worten, es schreibt in etwas wie C:\MyApp\%LOCALAPPDATA%\Microsoft\Windows\SchCache\
. Ich musste UserA explizite Schreibberechtigungen für diesen Ordner erteilen, damit das Programm ordnungsgemäß ausgeführt werden konnte.
Ich habe den Vorgang mit Process Monitor beobachtet und er geht sofort in diesen Ordner. Es ist nicht so, als ob er zuerst etwas versucht, C:\Users\
aber fehlschlägt.
Wenn ich mich als mein eigener Benutzer am Server anmelde und die ausführbare Datei manuell als BenutzerA ausführe, indem ichAls anderer Benutzer ausführen, die ausführbare Datei wird ausgeführt und schreibt die Cache-Datei erfolgreich in C:\Users\UserA\AppData\Local\Microsoft\Windows\SchCache\
.
Warum passiert das mit dem Taskplaner und was kann ich tun, um es zu beheben? Ich stelle mir vor, dass es damit zu tun hat, dass der Taskplaner das Programm im Kontext von UserA ausführt, aber nicht %LOCALAPPDATA%
als Umgebungsvariable initialisiert. Aus einer Laune heraus habe ich versucht,Mit höchsten Berechtigungen ausführenan der Aufgabe, aber das änderte nichts am Ergebnis.
Antwort1
Dies ist ein Fehler in Windows Server 2012 R2 und 8.1; Microsoft hat ihn dokumentiert inKB 2968540.
Das Problem wurde behoben und HotfixKB 3133689ist verfügbar. Dieser Hotfix behebt das Problem.
Geplante Aufgaben, die mit UBPM ausgeführt werden, verfügen nicht über ausreichende Umgebungsvariablen wie APPDATA, USERPROFILE oder TEMP, wenn der entsprechende Prozess gestartet wird.
Antwort2
Ich glaube, dass bei den geplanten Aufgaben in Windows 7/2012 ein Fehler vorliegt, sodass ihnen nicht die richtigen Umgebungsvariablen für den Benutzer angezeigt werden, als der sie ausgeführt werden:
https://stackoverflow.com/questions/32589381/
Um zu bestätigen, dass dies geschieht, können Sie SET>test.txt
eine Batchdatei in einer geplanten Aufgabe im selben Benutzerkontext ausführen. Wenn ich dies versuche, funktioniert esnichtzeigt den korrekten, vollständigen Satz von Umgebungsvariablen für den angegebenen Benutzer an; d. h. nicht denselben Satz, den Sie sehen, wenn Sie denselben Befehl (oder dieselbe Batchdatei) ausführen, während Sie tatsächlich als dieser Benutzer angemeldet sind. (Noch verwirrender ist, dass dies davon abhängt, ob der Benutzer derzeit angemeldet ist oder nicht, wenn die geplante Aufgabe ausgeführt wird; wenn er angemeldet ist, wird die Aufgabetutsiehe die richtigen Variablen.)
Ich denke, dieses Verhalten ist weder dokumentiert noch beabsichtigt und stellt einen Fehler in der Art und Weise dar, wie geplante Aufgaben unter Windows Server 2012 (vielleicht nur R2?) gehandhabt werden.
AchtungDies gilt PATH
auch für die Variable, so dass geplante Aufgaben nur ausführbare Dateien sehen können, die sich auf derStandardPfad oder im aktuellen Verzeichnis oder mit einem vollständig angegebenen Pfad. Der Aufruf von irgendetwas, das sich im angegebenen Benutzerpfad, aber nicht im Standardpfad befindet, führt zu einem schwer zu debuggenden (da es beim Testen funktioniert!) Fehler.
Antwort3
Dies ist eine Folge der Art und Weise, wie Windows Benutzerkonten behandelt. Wenn ein Benutzerkonto nicht angemeldet ist, wird dessen Benutzerregistrierungsstruktur – der Schlüssel darunter HKEY_USERS
wird normalerweise als zugeordnet HKEY_CURRENT_USER
– nicht bereitgestellt. Diese Struktur (die in einer Datei namens gespeichert ist, die im Profil jedes Benutzers steht NTUSER.DAT
) speichert fast alle benutzerspezifischen Daten, einschließlich benutzerspezifischer Umgebungsvariablen. Windows hat auch Systemumgebungsvariablen – einige Variablen, wie z. B. PATH, sind an beiden Orten vorhanden und werden zusammengeführt –, sodass diese auch dann angezeigt werden, wenn die Registrierungsstruktur des Benutzers nicht bereitgestellt ist. Keine der benutzerspezifischen Variablen wird jedoch angezeigt.
Ich weiß nicht, ob der Taskplaner dieses Szenario in anderen Windows-Versionen anders behandelt.könnteintelligent genug sein, den Hive des Benutzers zu mounten, bevor eine Aufgabe als dieser Benutzer ausgeführt wird. Unter Win7 / 2012R2 ist dies offenbar nicht der Fall.
Um dies zu beheben, müssen Sie sicherstellen, dass die Registrierungsstruktur des Benutzers gemountet ist. Der einfachste Weg, dies zu tun, besteht darin, sicherzustellen, dass der Benutzer angemeldet ist, da die Struktur eines angemeldeten Benutzers immer gemountet ist. Wenn dies nicht der Fall ist, können Sie versuchen, die Struktur selbst zu mounten (die API istRegLoadKey
aber ich habe nie versucht, es hierfür aufzurufen).