Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.01.15;
Скачать: CL | DM;

Вниз

Не работает доступ к WebDAV диску из-под сервиса   Найти похожие ветки 

 
Дмитрий Белькевич ©   (2016-02-02 18:04) [0]

Добрый всем день. Подключаю диск WebDAV к системе (Win 10, без домена, в домашней сети, WebDAV сервисы - яндекс диск или box.com).
В проводнике, фаре и т п. всё работает нормально - как будто с обычным локальным диском.
Пробую достучаться к диску из-под сервиса Windows (службы) Win возвращает ERROR_PATH_NOT_FOUND и ничего не работает.
Сервис запускается из-под админского аккаунта, проверял по диспетчеру задач. Насколько мне известно, то из-под system"а нет доступа до сетевых дисков.


 
Игорь Шевченко ©   (2016-02-02 18:28) [1]

Возможно, сервис запускается раньше, чем подключается диск


 
Дмитрий Белькевич ©   (2016-02-02 18:56) [2]

Нет - руками подключаю диск, потом стартую сервис. Сервис запускается из-под записи admin, он администратор. Может какие-то особенные разрешения нужны? Насколько я помню, то особенно права не трогал в винде, но мало ли...


 
Eraser ©   (2016-02-02 21:08) [3]

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


 
Eraser ©   (2016-02-02 21:09) [4]


> Сервис запускается из-под админского аккаунта

он скорее всего elevated, а нужно НЕ elevated.


 
Eraser ©   (2016-02-02 21:09) [5]


> Сервис запускается из-под админского аккаунта

извращение.


 
Дмитрий Белькевич ©   (2016-02-02 22:35) [6]


> что за WebDAV диск


http://inet-boom.ru/webdav-v-yandex-microsoft-i-google/


> соответственно, он виден только тому пользователю, который
> его подключил


залогинен admin, он его подключил, из-под него же запускается сервис.


> извращение


лучше, я так понимаю, специального юзера для этого выделять? вообще, то админ - у меня на рабочем буке, это не реальная установка.

спасибо всем за ответы, может быть удастся концы найти :)


 
Eraser ©   (2016-02-03 00:22) [7]


> Дмитрий Белькевич ©   (02.02.16 22:35) [6]
>

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

может я не правильно понимаю фразу?

> из-под него же запускается


 
Eraser ©   (2016-02-03 00:24) [8]


> Дмитрий Белькевич ©   (02.02.16 22:35) [6]
>
> > что за WebDAV диск
>
>
> http://inet-boom.ru/webdav-v-yandex-microsoft-i-google/

ну да, судя по скриншоту - сетевые диски, см. [3].


class function TImpersonateUtils.ImpersonateSessionUser(
 ASessionId: Cardinal): Boolean;
var
 hToken: THandle;
begin
 Result := False;
 hToken := 0;

 if not WTSQueryUserToken(ASessionId, hToken) then
 begin
   OutputDebugString(PChar("Error WTSQueryUserToken #" + IntToStr(GetLastError)));
   Exit;
 end;

 try
   if not ImpersonateLoggedOnUser(hToken) then
   begin
     OutputDebugString(PChar("Error ImpersonateLoggedOnUser #" + IntToStr(GetLastError)));
     Exit;
   end;

   Result := True;
 finally
   if hToken <> 0 then
     CloseHandle(hToken);
 end;
end;


 
Дмитрий Белькевич ©   (2016-02-03 02:10) [9]

WTSQueryUserToken возвращает 1314: Клиент не обладает требуемыми правами.


 
Дмитрий Белькевич ©   (2016-02-03 02:17) [10]

как из-под admin, так и из-под NETWORK SERVICES.

вызываю ImpersonateSessionUser(0) и ImpersonateSessionUser(2) ("admin" у меня во второй сессии, посмотрел WTSEnumerateSessions). результат всегда один - 1314.


 
Eraser ©   (2016-02-03 02:26) [11]


> Дмитрий Белькевич ©   (03.02.16 02:17) [10]
> как из-под admin, так и из-под NETWORK SERVICES.

зачем нужна служба, работающая от имени пользователя?


 
Дмитрий Белькевич ©   (2016-02-03 10:04) [12]


> зачем нужна служба, работающая от имени пользователя?


Вот как раз - нужен доступ до сетевых данных, как до "обычных" через Microsoft Network, так (уже) и вот таких - WebDAV. Пока что другим способом, кроме как с помощью работы от имени пользователя, добиться доступа до расшаренных по сети ресурсов не удалось. Насколько я помню - то и NETWORK SERVICES я тоже пробовал с отрицательным результатом. При этом доступа к подключенным буквам не удавалось добиться, в том числе и из сети MS. Прямые ссылки ("\\server3\test\123.bin") работают из-под пользователей нормально. Посмотрел на свои WebDAV диски под сервисом - то GetDriveType и GetVolumeInformation их не видит.

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

С локальными ресурсами всё вполне успешно работает просто под System.


 
Дмитрий Белькевич ©   (2016-02-03 10:23) [13]

попробовал код отсюда:

http://www.michael-puff.de/Programmierung/Delphi/Code-Snippets/Impersonate.shtml

код успешно выполнился: Impersonate(GetCurrUserName, "pass"), однако - доступа до WebDAV дисков не появилось.


 
Дмитрий Белькевич ©   (2016-02-03 10:24) [14]

под admin"ом.


 
Eraser ©   (2016-02-03 10:55) [15]


> Дмитрий Белькевич ©   (03.02.16 10:04) [12]
>

я написал выше, даже код привел, как можно из System

> добиться доступа до расшаренных по сети ресурсов


а вот из сервиса, запущенного под ограниченной NETWORK SERVICES, или вообще непонятной учеткой это сделать нельзя, разрешений не хватит.


 
Дмитрий Белькевич ©   (2016-02-03 11:31) [16]

Ок, спасибо. Из-под system успешно ImpersonateSessionUser успешно прошел, когда вызвал его с id = 2 (то есть - admin).
Еще вопрос - на какой Session Id делать impersonate до логина пользователя (логина может вообще не быть)?


 
Дмитрий Белькевич ©   (2016-02-03 11:58) [17]


> логина может вообще не быть


Впрочем, как и "букв". Поможет ли ImpersonateSessionUser при прямом доступе к сети, как я выше писал - к "\\server3\test\..."? При запуске из-под system без логина?


 
Eraser ©   (2016-02-03 13:41) [18]


> Дмитрий Белькевич ©   (03.02.16 11:31) [16]


> Еще вопрос - на какой Session Id делать impersonate до логина
> пользователя (логина может вообще не быть)?

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


 
Дмитрий Белькевич ©   (2016-02-03 16:14) [19]

то есть - сервис без логина для доступа к данным из сети нужно всё таки из-под юзера запускать?


 
Eraser ©   (2016-02-03 17:08) [20]


> Дмитрий Белькевич ©   (03.02.16 16:14) [19]

из сервиса можно делать логон нужного юзера, например, через LogonUser/LogonUserEx, и в его контексте получать доступ к сетевым дискам.


 
Дмитрий Белькевич ©   (2016-02-03 23:29) [21]

угу, пароли только где хранить :)


 
Eraser ©   (2016-02-03 23:58) [22]


> Дмитрий Белькевич ©   (03.02.16 23:29) [21]

можно там же, где их хранит винда, при указании юзера через оснастку сервисов.


 
Дмитрий Белькевич ©   (2016-02-05 18:46) [23]

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



Страницы: 1 вся ветка

Текущий архив: 2017.01.15;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.029 c
2-1421883809
Германн
2015-01-22 02:43
2017.01.15
Разработка приложения на системе с монитором низкого разрешения


15-1450856217
Dimka Maslov
2015-12-23 10:36
2017.01.15
Я ещё сплю?


15-1453995709
Внук
2016-01-28 18:41
2017.01.15
Классовые методы с неклассовыми свойствами


4-1279284463
POP
2010-07-16 16:47
2017.01.15
Есть ли смысл (сейчас) в Win_Inet_API?


1-1344667539
ExpertMQL4
2012-08-11 10:45
2017.01.15
OleContainer и Drag&amp;drop