WNetAddConnection2 из службы Windows - PullRequest
2 голосов
/ 03 июня 2010

Я пытаюсь подключиться к удаленной общей папке, защищенной паролем, из службы Windows, которая работает как учетная запись LocalSystem. Кажется, что учетная запись LocalSystem не может напрямую получить доступ к защищенным паролем сетевым ресурсам с помощью WNetAddConnection2 () или аналогичных вызовов. Кто-нибудь может это подтвердить? Я читал, что олицетворение пользователя-администратора может быть подходящим способом. Я пытался использовать LogonUser () и ImpersonateLoggedOnUser () до WNetAddConnection2 (), похоже, что монтирование сетевого пути успешно, но тогда фактический доступ (например, перечисление файлов в удаленной папке) не удается. Есть идеи?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 15 августа 2013

Я только что столкнулся с этой проблемой, и обнаружил, что если я добавлю имя удаленного компьютера в имя пользователя, это сработает. (На самом деле я этого не понимал, у нас уже было другое место в коде, которое делало это, и я знал, что это возможно, и наконец понял разницу.)

Так, например:

WNetAddConnection2(&nr, "password", "SomeComputer\\Username", 0);

Я не делаю никаких специальных вызовов, таких как LogonUser или ImpersonateLoggedOnUser.

Это служба, работающая под учетной записью SYSTEM.

Я не пробовал использовать учетную запись SomeComputer \ Administrator, но в любом случае это не совсем хорошая практика. Я использую обычную учетную запись пользователя на SomeComputer.

2 голосов
/ 04 июня 2010

Чтобы выразить доверие, я все время работал только в доменной среде и без защищенных паролем общих сетевых ресурсов, но я знаю, что есть два основных способа установить соединение: WNetAddConnection2 API и NetUseAdd API. Я рекомендую вам попробовать функцию NetUseAdd с уровнем, равным 1 (USE_INFO_1). Я использовал только USE_INFO_2, который имеет ui2_username, ui2_domainname и ui2_password, но USE_INFO_1 имеет только ui1_password, поэтому он выглядит как функция, созданная для подключения к защищенному паролем общему ресурсу.

Кстати, LogonUser () на самом деле не имеет смысла, потому что он local регистрируется на локальном компьютере, и вам необходимо установить сеанс на удаленном компьютере. Это делает WNetAddConnection2 и NetUseAdd функции.

1 голос
/ 26 апреля 2011

Способ доступа к сетевому ресурсу из локальной системной учетной записи («NT AUTHORITY \ SYSTEM»):

  1. Вам необходимо войти в систему, используя локальную учетную запись, которая имеет доступ к netowork даже в сети, не входящей в домен. Достаточно использовать учетную запись NT AUTHORITY \ NETWORK SERVICE, чтобы получить
  2. Добавить сетевое подключение с указанием учетных данных для доступа:

Главное здесь - использовать LOGON32_LOGON_NEW_CREDENTIALS тип входа во время вызова LogonUser () (подробности / ограничения см. В MSDN). В противном случае вы получите ERROR_NO_SUCH_LOGON_SESSION при выполнении WNetAddConnection2 (), даже если LogonUser и олицетворение пройдут успешно.


LogonUser("NETWORK SERVICE", "NT AUTHORITY", NULL, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &hToken );
ImpersonateLoggedOnUser(hToken);
NETRESOURCE nr;
nr.dwScope = RESOURCE_GLOBALNET;
nr.dwType = RESOURCETYPE_DISK;
nr.dwUsage = RESOURCEUSAGE_CONNECTABLE;
nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
nr.lpRemoteName = "\\\\SomeCopmuter\\C$";
nr.lpLocalName = "Z:";
WNetAddConnection2(&nr, "password", "Administrator", 0);

Примечания

  • Олицетворение работает только для текущего потока.
  • с локальными ресурсами он будет работать как LocalSystem, с добавленным общим ресурсом он будет работать как пользователь на удаленном компьютере, указанном в WNetAddConenction2 (в данном случае - Администратор на SomeComputer).
  • Вы можете не указывать букву диска в NETRESOURCE и обращаться к файлам через нотацию "\ server \ share \ filename.ext"
  • Это может не работать на некоторых старых системах (NT / 2000, точный список неизвестен)
0 голосов
/ 29 мая 2014

импорт win32wnet из win32netcon импорт RESOURCETYPE_DISK как путь DISK = "\ 192.168.1.11 \ Student" win32wnet.WNetAddConnection2 (DISK, "R:", "\ 192.168.1.11 \ Student", None, "Student", "pass" , 0)

0 голосов
/ 03 июня 2010

Я на самом деле сталкиваюсь с той же проблемой прямо сейчас, Флавио, и мое текущее подозрение состоит в том, что это работает, если кто-то вошел в систему на компьютере в интерактивном режиме, и вернет ERROR_NO_SUCH_LOGON_SESSION, если никто не вошел в систему. Хотя я могу ошибаться. Еще не все. Я пометил этот вопрос и вернусь:)

...