Вам не нужно несколько экземпляров вашего сервиса. Из описания вашей проблемы кажется, что вам нужна одна услуга, которая может олицетворять пользователей и выполнять задания от их имени.
Вы можете сделать это, реализовав объект COM, размещенный в службе. Ваше клиентское приложение (которое запускает конечный пользователь) вызовет CoCreateInstanceEx в вашем CLSID. Это приведет к созданию нового экземпляра вашего COM-объекта в вашей службе. Затем приложение может использовать метод на одном из ваших интерфейсов для передачи собранных учетных данных пользователя объекту COM (хотя я бы опасался собирать учетные данные и вместо этого видел, могу ли я передать токен пользователя).COM-объект, который запущен в контексте службы, может затем вызвать LogonUser() для входа в систему пользователя и олицетворения его, поэтому он может делать все, что от ее имени (например, найти локальную папку appdata пользователя :-)). Другие ответы содержат хорошие ссылки на олицетворение пользователей с использованием учетных данных или токенов.
Если вы чувствуете себя комфортно с COM, я бы предложил вам создать ваши объекты как многопоточные (живущие в MTA), чтобы их выполнение не было сериализовано COM. Если нет, модель с одним потоком по умолчанию будет достаточно для вас.
Мастер Visual Studio ATL может генерировать скелет COM-объекта, проживающего в сервисе. Вы также можете прочитать о внедрении Windows Service с ATL: http://msdn.microsoft.com/en-us/library/74y2334x(VS.80).aspx
Если вы вообще не знаете COM, вы можете использовать другие каналы связи, чтобы передать учетные данные своей службе.
В любом случае, как только ваша служба получит учетные данные, вся работа от имени пользователя должна выполняться в фоновом потоке, чтобы не блокировать приложение, выполняемое как пользователь.
Да, но я бы хотел, чтобы служба запускалась в качестве пользователя, даже если никто не вошел в систему. Или как несколько пользователей одновременно, если несколько пользователей использовали его на машине. – dennisV