?
Ответы на интересные вопросыАннотация: Данная страничка была начата, когда я понял, что многие вопросы просто повторяются, а я к тому же потерял ответ и необходимо было снова вспоминать и писать ответ. Вопрос о доступе к сетевым дискам из Windows ServiceДобрый день, Влад! ...... Коротко о моей проблеме. Сервис должен круглосуточно заходить в сетевые папки на диске U "подмепливается" при старте и считывать даты определенных файлов. По факту сервис не видит ничего кроме A, C, D. Все файловые навигаторы видят U и кучу других дисков. Для проверки написал такой код и вставил в сервис "там сейчас ничего нет кроме этого куска": StreamWriter fs = new StreamWriter(new FileStream(@"C:\Service\test.txt", System.IO.FileMode.Append), Encoding.Default); // сюда пишу результат теста string[] Drivers = Environment.GetLogicalDrives(); // тут еще как вариант пробовалкоманду: string[] Drivers = System.IO.Directory.GetLogicalDrives(); //результатодинаковый foreach (string dir in Drivers) { fs.WriteLine(dir); // Все найденные диски заношу в файл } fs.Flush(); fs.Close(); В результате в файле C:\\Service\\test.txt такое содержание: A:\ C:\ D:\ Точно такой же кусок кода вставил в новую консольную программу: В файле C:\\Service\\test.txt появился сетевой диск: A:\ C:\ D:\ U:\ Сервис толкал и локальным и сетевым. Пробовал запускать от имени админа. Профиль всех запускающих входит в домен сети, в которой диск U. Нигде никаких блокировок не установлено. Может у вас будут какие-то мысли на тему, в чем дело, как мне к сетевому диску добраться? Еще хочу сообщить, что сервис установлен на виртуальной машине (VMvare) windows 7 Спасибо. ОтветАлексей! Служба не может получить доступ к сетевому диску, поскольку по умолчанию она работает под LocalService акаунт, который не имеет разрешения на доступ к сети и не получают никакого специального провайдера по умолчанию. Вы можете получить доступ к диску через консоль или окно приложения потому, что у вас есть права на него, и, соответственно, программа, работающая имеет права на это также. Поэтому там где при создании службы вы прописывали - в книге это "Раздел 9 Создание Windows C# служб (сервисов) в Visual Studi NET" фраза(над рисунком 3): "Для ServiceProcessInstaller1 устанавливаем значение Account в LocalSystem (Рис.3.). " Вместо LocalSystem поставьте "User". Как результат, при инсталляции программа потребует от Вас ваше полное доменное имя и пароль, причем дважды. После этого служба будет работать под Вами - можете увидеть это в свойствах уже инсталированной службы. Но и в этом случае Environment.GetLogicalDrives() покажет только локальные диски, а сетевые можно увидеть так: ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_MappedLogicalDisk"); foreach (ManagementObject manObject in searcher.Get()) { Trace.WriteLine(manObject["Name"]); } Полный текст сервиса: using System; using System.Collections.Generic; using System.Configuration; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; using System.Text; using IWshRuntimeLibrary; using System.Collections; using System.Management; namespace writersoinbr { public partial class writersoinbr : ServiceBase { private System.Timers.Timer timer1; internal static TraceSwitch TraceLevelSwitch = new TraceSwitch("TraceLevel", "Global tracing level"); private string sVivod = string.Empty; public writersoinbr() { InitializeComponent(); } protected override void OnStart(string[] args) { Trace.Listeners.Add(new TextWriterTraceListener(System.Environment.SystemDirectory + @"\Logfiles\writersobr." + DateTime.Now.ToString("yyyyMMdd") + ".log")); Trace.AutoFlush = true; string s = DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss"); Trace.WriteLine(s + ": GetDrivers started"); this.timer1 = new System.Timers.Timer(); this.timer1.Enabled = true; this.timer1.Interval = 1000 * 10; this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed); this.timer1.AutoReset = true; vGetNetDrivers(); this.timer1.Start(); } protected override void OnStop() { this.timer1.Stop(); string s = DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss"); Trace.WriteLine(s + ": GetDrivers bring to a stop"); } public void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { vGetNetDrivers(); } public void vGetNetDrivers() { sVivod = string.Empty; string[] drivers = Environment.GetLogicalDrives(); //Не работает выводит только локальные if (drivers.Length > 0) { for (int i = 0; i < drivers.Length; i++) { sVivod += drivers[i] + " "; } Trace.WriteLine(sVivod); } try { sVivod = string.Empty; WshNetwork network = new WshNetwork(); //Не работает - ничего не вмдит foreach (IEnumerable driver in network.EnumNetworkDrives()) { Trace.WriteLine("3"); sVivod += driver.ToString() + " "; } } catch (Exception ex) { Trace.WriteLine(ex.Message); } Trace.WriteLine(sVivod); //Работает ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_MappedLogicalDisk"); foreach (ManagementObject manObject in searcher.Get()) { Trace.WriteLine(manObject["Name"]); } } } } |