? Ответы на вопросы

К началу книги

Ответы на интересные вопросы

Аннотация: Данная страничка была начата, когда я понял, что многие вопросы просто повторяются, а я к тому же потерял ответ и необходимо было снова вспоминать и писать ответ.

Вопрос о доступе к сетевым дискам из 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"]);
   }
  }
 }
}

На главную страницу

В начало страницы, главы и раздела

К началу книги


Сайт управляется системой uCoz