Получить корневой каталог пользователя из службы Windows

У меня есть служба Windows, написанная на С#. Мне нужно добавить файл в каждый каталог пользователя. Как найти путь для начала? Я понимаю, что это действительно глупо, но вот что я сейчас делаю:

  if (Directory.Exists("C:\\Users"))
  {
    path = "C:\\Users";
  }
  else if (Directory.Exists("C:\\Documents and Settings"))
  {
    path = "C:\\Documents and Settings";
  }

Я просмотрел специальные папки: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

Кажется, ни один из них не возвращает то, что мне нужно. Например, ApplicationData возвращает путь к каталогу System32. Я предполагаю, что это потому, что он работает как служба Windows. Код, который я сейчас использую, работает для нескольких тестов, которые я сделал. Просто кажется, что должен быть более интеллектуальный (защищенный от ошибок) способ получения этого пути.

Еще одна мысль... может быть, есть раздел реестра, который даст мне то, что я ищу? Хм


person exvance    schedule 08.08.2013    source источник
comment
Интересно, как пользователи могут существовать и в других каталогах.   -  person SLaks    schedule 08.08.2013
comment
Да, я знаю, что это возможно... поэтому я ищу лучшее решение.   -  person exvance    schedule 08.08.2013
comment
Нет; Я имею в виду, что пользователи могут существовать в нескольких каталогах.   -  person SLaks    schedule 08.08.2013
comment
Вы никогда не должны использовать жестко заданный путь, как указано выше, так как они не согласуются с версиями ОС. Хотя более новые версии Windows поддерживают обратную совместимость, создавая программные/жесткие ссылки на устаревшие имена папок, нет гарантии, что так будет всегда.   -  person Tseng    schedule 08.08.2013
comment
@Tseng: Именно поэтому он задает этот вопрос.   -  person SLaks    schedule 09.08.2013
comment
Почему эти файлы должны существовать в структуре папок каждого пользователя? Нужны ли им отдельные копии? Такое ощущение, что вы пытаетесь решить проблему с помощью решения, которое вы придумали для неизвестной проблемы, о которой вы нам не сказали.   -  person Damien_The_Unbeliever    schedule 09.08.2013


Ответы (3)


Я нашел это в реестре Win7. Похоже, что XP имеет те же ключи реестра, но значения имеют профиль «Все пользователи».

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
"Common Desktop"="C:\\Users\\Public\\Desktop"
"Common Start Menu"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu"
"CommonVideo"="C:\\Users\\Public\\Videos"
"CommonPictures"="C:\\Users\\Public\\Pictures"
"Common Programs"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"
"CommonMusic"="C:\\Users\\Public\\Music"
"Common Administrative Tools"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Administrative Tools"
"Common Startup"="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"
"Common Documents"="C:\\Users\\Public\\Documents"
"OEM Links"="C:\\ProgramData\\OEM Links"
"Common Templates"="C:\\ProgramData\\Microsoft\\Windows\\Templates"
"Common AppData"="C:\\ProgramData"
person Switch    schedule 08.08.2013
comment
Служба не запускается в контексте пользователя, так как же может существовать эта переменная окружения? - person Brad Christie; 08.08.2013
comment
Служба работает под Системой? - person Switch; 09.08.2013

Я может быть не понял вас до конца но я думаю вам просто нужно получить локацию откуда вы бежите и потом с нее рут скинуть.

Path.GetPathRoot(Assembly.GetEntryAssembly().Location);

Обновить

Вам нужно изучить специальные папки. Здесь нет простого способа сделать это, потому что ваш вопрос не был достаточно подробным. Если служба работает как конкретный пользователь или как система, это имеет значение. Кроме того, вы не указали, как он использовался, так что это имело бы значение. Это место для хранения файлов конфигурации или временного местоположения для записи файлов, а не для того, чтобы кто-то еще хотел получить доступ к папке? Все эти вещи имеют значение, поэтому, если вы добавите некоторые дополнительные детали, я обновлю свой ответ.

person phillip    schedule 08.08.2013
comment
Я полагаю, что он пытается получить доступ ко всем профилям пользователей, но, поскольку он работает под системной учетной записью, он не знает, как его получить. - person Switch; 09.08.2013

Как насчет HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList и ключа ProfilesDirectory? Он указывает на %SystemDrive%\Users на моем компьютере. Просто не уверен, какие версии Windows имеют этот ключ (7 и 10).

person Mike Lowery    schedule 09.11.2018