?
Ответы на интересные вопросыАннотация: Данная страничка была начата, когда я понял, что многие вопросы просто повторяются, а я к тому же потерял ответ и необходимо было снова вспоминать и писать ответ. Вопрос о доступе к сетевым дискам из 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"]);
}
}
}
}
|