Сетевой диск недоступен, если сопоставлен службой - PullRequest
5 голосов
/ 01 декабря 2011

Я создаю службу, которая определена для входа в систему как администратор.
Эта служба выполняет систему ("net use Z: \ ... / user: user password") и успешно завершается.

Если я (как администратор) запускаю «net use», я вижу Z: действительно добавлено, но со статусом - недоступно.

Я попытался добавить ImpersonateLoggedOnUser в службу, но это не помогло.

ОС: Win XP

Чего мне не хватает?

Ответы [ 2 ]

5 голосов
/ 05 декабря 2011

ImpersonateLoggedOnUser не олицетворяет сеанс входа в систему с токена пользователя, только контекст безопасности. Однако CreateProcessAsUser должен иметь возможность создавать новый процесс в сеансе входа в систему, связанный с указанным токеном пользователя.

Обратите внимание, что вызов LogonUser для получения токена пользователя для CreateProcessAsUser не будет работать, поскольку этот токен не будет находиться в том же сеансе входа в систему, что и вошедший в систему пользователь. Вы должны найти один из процессов пользователя и продублировать его токен.

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

В Windows Vista и более поздних версиях создаются два сеанса входа в систему при входе пользователя-администратора, один из которых связан с маркером ограниченного доступа, а другой - с маркером повышенного уровня.

Вы можете посмотреть сеанс входа в систему, связанный с токеном, используя функцию GetTokenInformation с опцией TokenStatistics. Сеанс входа определяется идентификатором AuthenticationId.

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

Вместо этого лучшим вариантом будет разделить приложение на два компонента. Один компонент будет работать от имени пользователя (вы, вероятно, запустите его автоматически с помощью клавиши Run) и будет отвечать за подключение сетевого диска. Он может связаться со службой, чтобы получить любую необходимую ему информацию, либо через именованный канал, либо через ключ реестра.

3 голосов
/ 01 декабря 2011

Windows входит в систему с правами администратора и использует маркер входа для запуска службы.Если вы входите в систему в интерактивном режиме, Windows создает маркер входа для вас.Два токена не связаны друг с другом.Сопоставленные устройства сопоставляются для одного токена сеанса / входа, поэтому, если служба сопоставляет устройство, вы не видите его в сеансе входа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...