Вам не нужно несколько экземпляров вашего сервиса. Из описания вашей проблемы видно, что вам нужна одна служба, которая может выдавать себя за пользователей и выполнять задания от их имени.
Вы можете сделать это путем реализации 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, вы можете использовать другие каналы связи для передачи учетных данных вашей службе.
В любом случае, как только ваша служба получит учетные данные, вся работа от имени пользователя должна будет выполняться в фоновом потоке, чтобы не блокировать приложение, работающее от имени пользователя.