с паролем.
Собственно понятно что по умолчанию сервис под LOCAL SYSTEM из которой подключаться нельзя. Поэтому пишем примерно такой код (DriveName оставляю пустым чтобы обращаться по сетевому пути, в user, pass передаю логин пароль пользователя которому разрешен доступ).
procedure ConnectNetDrive(const DriveName, Machine, User, Pass : string);
var NRW: TNetResource;
v: DWord;
Token: NativeUInt;
res: string;
begin
with NRW do
begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwUsage := RESOURCEUSAGE_CONNECTABLE;
dwDisplayType := RESOURCEDISPLAYTYPE_SHARE;
lpLocalName := pchar(DriveName);
lpRemoteName := pchar(machine);
lpComment := nil;
lpProvider := '';
end;
if not LogonUser('NETWORK SERVICE', 'NT AUTHORITY', nil, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, Token ) then
RaiseLastOSError;
if not ImpersonateLoggedOnUser(Token) then
RaiseLastOSError;
v := WNetAddConnection2(NRW, pchar(pass), pchar(user), CONNECT_TEMPORARY);
И что интересно, ConnectNetDrive2 возвращает 0, но прочитать из папки ничего нельзя.
Ладно, может что-то не так с имперсонализацией. Создаю другого пользователя администратора, убираю LogonUser и Impersonate, оставляю только WNetAddConnection2. Та же картина.
При этом если запустить сервис из под того пользователя кому разрешен доступ, то он папку видит.
Что за ерунда? Ошибок нет, доступ не работает.
А почему бы не сделать так? можно же все подключить через консоль, если не через консольть, тогда сперва административный глобальный ресурс IPC$ net use \\nethost\IPC$ %pwd% /user:%user% а потом обращаемся к нужной директории \\nethost\haredir
Обсуждают сегодня