Pertanyaan Task Scheduler program menulis ke folder literal bernama% LOCALAPPDATA%


Saya memiliki .NET executable (yang saya buat) yang menggunakan Microsoft Antarmuka Layanan Direktori Aktif (melalui System.DirectoryServices.AccountManagement) untuk melakukan kueri LDAP. Secara internal ke ADSI, itu mengunduh skema Active Directory dan menyimpannya secara lokal. Seharusnya menyimpan skema ini di folder di %LOCALAPPDATA%\Microsoft\Windows\SchCache\.

Ketika saya menjadwalkan eksekusi ini di Penjadwal Tugas pada Windows Server 2012 R2 dan atur untuk dijalankan sebagai "UserA" bahkan jika pengguna itu tidak masuk, program berjalan tetapi mencoba untuk menulis file cache di atas menjadi file folder secara harfiah bernama %LOCALAPPDATA%\Microsoft\Windows\SchCache\ dalam memulai folder dari tugas yang dijadwalkan (yang sengaja diatur ke folder executable saya). Dengan kata lain, itu menulis menjadi sesuatu seperti itu C:\MyApp\%LOCALAPPDATA%\Microsoft\Windows\SchCache\. Saya harus memberi UserA izin tulis eksplisit ke folder ini untuk memungkinkan program berjalan dengan benar.

Saya telah melihat proses tugas dengan Proses Monitor dan segera pergi ke folder itu. Ini tidak seperti pertama kali mencoba sesuatu C:\Users\ tetapi gagal.

Ketika saya login ke server sebagai pengguna saya sendiri dan secara manual menjalankan executable sebagai UserA dengan menggunakan Jalankan sebagai pengguna yang berbeda, jalankan dieksekusi dan berhasil menulis file cache ke dalam C:\Users\UserA\AppData\Local\Microsoft\Windows\SchCache\.

Mengapa ini terjadi dengan Penjadwal Tugas dan apa yang dapat saya lakukan untuk memperbaikinya? Saya membayangkan itu mungkin ada hubungannya dengan Task Scheduler mengeksekusi program dalam konteks UserA tetapi tidak melakukan initialaizing %LOCALAPPDATA% sebagai variabel lingkungan. Pada iseng saya mencoba pengaturan Jalankan dengan hak istimewa tertinggi pada tugas, tetapi itu tidak mengubah hasilnya.


4
2017-07-10 15:51


asal


Bisakah kamu gunakan Environment.GetFolderPath bukannya variabel lingkungan? - heavyd
Apa pun yang menyelesaikan jalur ada dalam Microsoft DLL, bukan kode saya sendiri. - Luke Z
Benar, tetapi saya menyarankan untuk menyelesaikan jalur sebelum Anda meneruskannya ke DLL. - heavyd
@heavyd Tidak ada jalan yang lewat. Ini hanya panggilan untuk UserPrincipal.FindByIdentity, sebagai contoh. File sementara semua internal ke DLL eksternal. - Luke Z
Apakah UserA adalah domain atau pengguna lokal? Apakah pengguna tersebut pernah login secara interaktif ke dalam mesin? Apakah itu akun pengguna standar atau administratif? Apakah sudah diberikan LOGON SEBAGAI PEKERJAAN BATCH pengguna benar? - Twisty Impersonator


Jawaban:


Saya yakin ada bug di tugas terjadwal Windows 7/2012, sehingga mereka tidak melihat variabel lingkungan yang benar untuk pengguna yang dijalankannya:

https://stackoverflow.com/questions/32589381/

Untuk mengonfirmasi ini terjadi, Anda bisa berlari SET>test.txt dalam file batch dalam tugas yang dijadwalkan, dalam konteks pengguna yang sama. Ketika saya mencoba ini, itu benar tidak menunjukkan kumpulan variabel lingkungan yang benar dan lengkap untuk pengguna yang ditentukan; yaitu bukan kumpulan yang sama yang Anda lihat jika Anda menjalankan perintah yang sama (atau file batch) ketika benar-benar masuk sebagai pengguna itu. (Bahkan lebih membingungkan, ini tergantung pada apakah pengguna saat ini masuk atau tidak ketika tugas yang dijadwalkan berjalan; jika mereka masuk, maka tugas tidak lihat variabel yang benar.)

Saya pikir perilaku ini tidak didokumentasikan atau dimaksudkan, dan merupakan bug dalam cara tugas-tugas terjadwal Windows Server 2012 (mungkin hanya R2?) Ditangani.

NB Ini berlaku untuk PATH variabel juga, sehingga tugas yang dijadwalkan hanya dapat melihat executable yang ada di default jalan, atau di direktori saat ini, atau dengan jalur yang ditentukan sepenuhnya. Memanggil apa pun yang ada di jalur pengguna yang ditentukan, tetapi tidak di jalur default, akan memberikan galat yang sulit didebit (karena berfungsi dalam pengujian!).


0
2017-09-16 10:35





Ini adalah konsekuensi dari cara Windows menangani akun pengguna. Ketika akun pengguna tidak masuk, daftar registri pengguna mereka - kunci di bawah HKEY_USERS yang biasanya dipetakan sebagai HKEY_CURRENT_USER - tidak di-mount. Hive itu (yang disimpan dalam file, di setiap profil pengguna, dipanggil NTUSER.DAT) menyimpan hampir semua data per pengguna, termasuk variabel lingkungan per pengguna. Windows juga memiliki variabel lingkungan sistem - beberapa variabel, seperti PATH, hadir di kedua lokasi dan digabungkan - sehingga akan muncul bahkan jika kumpulan registri pengguna tidak di-mount. Tak satu pun dari yang spesifik-pengguna akan, meskipun.

Saya tidak tahu apakah Task Scheduler menangani skenario ini secara berbeda di versi Windows lainnya. Saya t bisa cukup pintar untuk memasang sarang pengguna sebelum menjalankan tugas sebagai pengguna itu. Di Win7 / 2012R2, ternyata tidak.

Untuk memperbaikinya, Anda perlu memastikan sarang registri pengguna sudah terpasang. Cara termudah untuk melakukan ini adalah hanya untuk memastikan pengguna masuk, karena sarang pengguna yang sudah masuk selalu dipasang. Kurang itu, Anda dapat mencoba memasang sarang sendiri (API adalah RegLoadKey tetapi saya belum pernah mencoba menerapkannya untuk ini).


0
2017-09-17 05:04





Ini adalah bug di Windows Server 2012 R2 dan 8.1; Microsoft telah mendokumentasikannya KB 2968540.

Masalahnya telah diperbaiki dan perbaikan terbaru KB 3133689 tersedia. Perbaikan terbaru ini menyelesaikan masalah.

Tugas terjadwal yang dijalankan dengan menggunakan UBPM tidak memiliki variabel lingkungan yang cukup seperti APPDATA, USERPROFILE, atau TEMP ketika proses yang sesuai dimulai.


0
2017-12-08 23:17