ImpersonateLoggedOnUser не олицетворяет сеанс входа в систему с токена пользователя, только контекст безопасности. Однако CreateProcessAsUser должен иметь возможность создавать новый процесс в сеансе входа в систему, связанный с указанным токеном пользователя.
Обратите внимание, что вызов LogonUser для получения токена пользователя для CreateProcessAsUser не будет работать, поскольку этот токен не будет находиться в том же сеансе входа в систему, что и вошедший в систему пользователь. Вы должны найти один из процессов пользователя и продублировать его токен.
Сеансы входа в систему недостаточно хорошо документированы, но все, что вам действительно нужно знать, это то, что каждый раз, когда пользователь проходит аутентификацию, создается отдельный сеанс входа в систему, и что каждый такой сеанс входа в систему имеет отдельный набор сопоставлений сетевых дисков. Сеансы входа не совпадают с сеансами служб терминалов.
В Windows Vista и более поздних версиях создаются два сеанса входа в систему при входе пользователя-администратора, один из которых связан с маркером ограниченного доступа, а другой - с маркером повышенного уровня.
Вы можете посмотреть сеанс входа в систему, связанный с токеном, используя функцию GetTokenInformation с опцией TokenStatistics. Сеанс входа определяется идентификатором AuthenticationId.
Чтобы эта работа работала, вашей службе необходимо сначала выяснить, когда пользователь вошел в систему, дождаться запуска процесса, связанного с новым сеансом, убедиться, что это не процесс с повышенными правами, а затем продублировать токен доступа.
Вместо этого лучшим вариантом будет разделить приложение на два компонента. Один компонент будет работать от имени пользователя (вы, вероятно, запустите его автоматически с помощью клавиши Run) и будет отвечать за подключение сетевого диска. Он может связаться со службой, чтобы получить любую необходимую ему информацию, либо через именованный канал, либо через ключ реестра.