WNetAddConnection2 из службы Windows

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

Спасибо.


person Flavio    schedule 03.06.2010    source источник


Ответы (5)


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

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

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

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

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

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

person Walt    schedule 15.08.2013

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

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

person Oleg    schedule 03.06.2010
comment
Я пытаюсь использовать LogonUser(), потому что я прочитал в документации MS, что учетная запись LocalSystem не может устанавливать аутентифицированные соединения с удаленными компьютерами, поэтому идея состоит в том, чтобы сначала выдать себя за пользователя, который может устанавливать соединения (т.е. локальный компьютер администратор), а затем попытаться установить соединение. - person Flavio; 08.06.2010
comment
У вас могут возникнуть проблемы, только если вы не используете WNetAddConnection2 или NetUseAdd и пытаетесь получить доступ к удаленному компьютеру. Если вы используете WNetAddConnection2` или NetUseAdd, вы выполняете удаленный вход на целевом компьютере. Если у вас нет доверия между исходным и конечным компьютерами, локальный вход в систему с LogonUser может завершиться ошибкой, поскольку ваш локальный компьютер не должен знать пользователя с удаленного компьютера. Кстати, если оба компьютера находятся в одном домене, то подключение к удаленному компьютеру может работать с учетной записью компьютера (см. 85).aspx" rel="nofollow noreferrer">msdn.microsoft.com/en-us/library/ms677973(VS.85).aspx), если это разрешено. - person Oleg; 08.06.2010
comment
Как я уже сказал, WNetAddConnection2() не работает в Windows XP. Это работает в Windows 7. Это не в домене. Я использую LogonUser() для входа на локальный компьютер в качестве обычного пользователя, чтобы выдать себя за него перед вызовом WNetAddConnection2(). - person Flavio; 08.06.2010
comment
Конечно, WNetAddConnection2() работает в Windows XP и в ранних версиях Windows, но, вероятно, не с общей папкой, защищенной паролем, вместо обычно используемого общего доступа, предоставленного пользователем. Вы пробовали NetUseAdd? Если у вас есть проблемы с этим, вы должны опубликовать свой код. Путь с LogonUser() ОПРЕДЕЛЕННО НЕПРАВИЛЬНЫЙ. Просто создайте на целевом компьютере учетную запись и попробуйте войти на исходном компьютере с этой учетной записью, используя LogonUser(). Он не будет работать независимо от учетной записи LocalSystem какой-либо другой. - person Oleg; 08.06.2010

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

  1. Вам нужно войти в систему, используя какую-либо локальную учетную запись, которая имеет доступ к сети даже в не доменной сети. Для этого достаточно использовать учетную запись "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, точный список не знаю)
person mistika    schedule 26.04.2011

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

person joshk0    schedule 03.06.2010
comment
На данный момент я обнаружил, что вызов WNetAddConnection2() из службы LocalSystem работает в Windows 7, но не работает в XP. До сих пор я всегда пробовал, когда пользователь входил в систему в интерактивном режиме. Я думаю, что для службы не должно иметь значения, если другой пользователь вошел в систему на удаленной машине, но я могу ошибаться. - person Flavio; 08.06.2010

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

person shahin    schedule 29.05.2014