Войдите в общий сетевой ресурс Windows (SMB) только для этого процесса.

Легко войти в общий сетевой ресурс Windows (SMB) на протяжении всего сеанса пользователя (например, net use, WNetAddConnection2() и т. Д.).

Есть ли аналогичный способ, который повлияет только на мой текущий процесс?

Может быть, какая-то система токенов?

Аутентификация всего сеанса - это нормально, если на самом деле нет альтернативы, но я бы предпочел избежать «глобального решения локальной проблемы».


person mappu    schedule 06.03.2017    source источник


Ответы (2)


Сетевые сеансы обрабатываются ядром Windows как часть клиентского драйвера smb, поэтому они управляются каждой рабочей станцией Windows (а не пользователем на самом деле), что означает, что вы не можете получить доступ к одному и тому же общему ресурсу с двумя разными учетными данными, и вы можете ' Фактически создавать новое сетевое соединение для каждого процесса в соответствии с ограничением, наложенным клиентом Windows smb. Причина ограничения заключается в том, что Microsoft реализовала общий доступ как драйвер фильтра, каждый UNC-путь (\ share \ test) для общего доступа хранится как общий ресурс, чтобы упростить вашу жизнь как разработчику и пользователю. (делает беспрепятственный доступ к совместному использованию)

Быстрый пример этого - запуск net use в командной строке с повышенными привилегиями (запуск от имени администратора) и попытка доступа к нему в неуправляемом контексте.

вы можете пойти любым путем:

  1. используйте в своем программном обеспечении samba / другую реализацию пользовательского пространства smb (есть некоторые основанные на Python)
  2. создайте новую winstation для каждого из ваших процессов (это связано с большими накладными расходами)
person Jonathan Allon    schedule 24.04.2017
comment
Я делаю это принятым ответом, потому что вы правы, это можно сделать для каждого процесса, если вы создадите совершенно новый сеанс входа / winstation для этого процесса. К счастью, это возможно в моей ситуации (служба Windows с выделенной учетной записью). - person mappu; 29.06.2018
comment
рад, что кто-то на самом деле использует мои знания вуду о драйвере клиента smb - person Jonathan Allon; 29.06.2018

Сетевые сеансы (и присвоенные буквы дисков) обрабатываются для каждого пользователя, а не для каждого процесса. Так что нет, вы не можете создать сеанс SMB только для своего процесса, если он не работает с выделенной учетной записью пользователя. В противном случае вам просто нужно будет добавить глобальное соединение (включая, например, флаг CONNECT_TEMPORARY), а затем удалить соединение (WNetCancelConnection2()), когда вы закончите его использовать.

person Remy Lebeau    schedule 07.03.2017
comment
Думаю, вы правы, если не считать запуска собственного стека SMB в пользовательском пространстве. - person mappu; 07.03.2017