2013-08-08 4 views
4

У меня есть служба Windows, написанная на C#. Мне нужно добавить файл в каждый каталог пользователя. Как я могу найти путь для начала? Я понимаю, что это действительно немой, но это то, что я сейчас делаю:Получить пользовательский корневой каталог из службы 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. Код, который я использую в настоящее время для нескольких тестов, которые я сделал. Кажется, что должен быть более интеллектуальный (способ проверки ошибок) для получения этого пути.

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

+0

Интересно, как это возможно для пользователей в других каталогах. – SLaks

+0

Да, я знаю, что это возможно ... вот почему я ищу лучшее решение. – exvance

+0

Нет; Я имею в виду, чтобы пользователи существовали в нескольких каталогах. – SLaks

ответ

1

Я нашел это под реестром 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" 
+2

Служба не запускается в контексте пользователя, так как бы существовала эта переменная среды? –

+0

Работает ли служба под Системой? – Switch

0

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

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

Update

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

+0

Я считаю, что он пытается получить доступ ко всем пользователям профилей, но поскольку он работает под учетной записью системы, он не знает, как его получить. – Switch

+0

Да, это может быть немного неудобно. спасибо – phillip

Смежные вопросы