Во-первых,
CreateProcessAsUser и
CreateProcessWithLogon если нужно просто запустить процесс от имени другого пользователя (известного), с меньшим набором привилегий.
Во-вторых, если не желательно иметь процесс от имени другого пользователя, если не хотим требовать, чтобы альтернативная учётная запись с более низкими правами вообще существовала, и не хотим запрашивать имя/пароль и где-то хранить: в Windows NT есть такой специальный ядерный объект — token — который и определяет, что каждый отдельно взятый процесс имеет и не имеет права делать.
Когда пользователь авторизуется, система создаёт объект «токен» и ассоциирует первично запускаемый процесс с этим токеном. Когда процесс запускает дочерние процессы, они напрямую наследуеют токен родительского процесса. Однако, на базе текущего токена некий процесс может при желании создать унаследованный токен, урезав какие-то привилегии, и при создании дочернего процесса передать хендл этого нового токена. Делается это функцией
CreateRestrictedToken.