У меня есть программное обеспечение, которое требует, чтобы системное время Windows было синхронизировано с физическими атомными часами * перед началом определенной процедуры.
Прямо сейчас у пользователя есть инструкции по изменению времени с помощью timedate.cpl
прежде, чем они начнутся.
Я хотел бы отобразить поле ввода часа и минуты и позволить пользователю щелкнуть кнопку, когда время совпадет, так же, как если бы вы начинали обратный отсчет. Это упрощает извлечение времени, как только они нажимают на мою кнопку. Для этого я хотел бы запустить такую системную команду:
runas /noprofile /user:Administrator "time 12:34"
Однако, когда я это проверяю, он запрашивает у меня пароль.
Я хотел бы знать, есть ли способ дать моей программе право устанавливать время без необходимости каждый раз вводить пароль?
Примечание:
* Атомные часы подходят, потому что время не сильно смещается в течение длительного периода времени. Точность не имеет значения. До сих пор операторы фактически записывали время на листе бумаги перед тем, как начать шаг.
Вы не указываете, являются ли эти машины частью домена Active Directory или нет. Я предполагаю, что это не так.
Вы не указываете, какая у вас версия Windows. Катаклизм до и после Vista огромен. Это практически совершенно другая операционная система. Вы не можете просто сказать «Windows», так как Windows сильно изменилась за свою более чем 20-летнюю историю. Я предполагаю что-нибудь Vista или выше.
В приведенном выше примере вы пытаетесь запустить программу от имени администратора, и для этого вы должны указать пароль для администратора. В Windows нет прямого эквивалента sudo. Не существует хорошего способа встроить учетные данные администратора в сценарий или скрыть их каким-либо способом, который не подвергал бы опасности раскрытие пароля обычному пользователю.
В любом случае вы не даете разрешения или права доступа программам. Вы даете разрешения пользователям, которые запускают программы. Эти программы выполняются в контексте безопасности этого пользователя. Программы наследуют свои привилегии безопасности от пользователя, который их выполнил.
Вы можете использовать групповую политику или политику локального компьютера (secpol.msc), чтобы делегировать это право пользователю. Любого пользователя (или группы пользователей), который вам нравится.
Техническое название привилегии - SeSystemtimePrivilege
право пользователя.
Но подождите, это еще не все! Изменение системного времени - это привилегированная операция, и пользователь может нанести серьезный ущерб, злонамеренно или случайно изменив системное время. Поэтому я не думаю, что в настоящее время вы сможете изменить системное время как обычный пользователь.
NTRights.exe -u JoeBlow +r SeSystemtimePrivilege
из Resource Kit 2003 в основном делает то же самое, что и добавление пользователя в список «Изменить системное время» в secpol.msc, и вы все равно получите A required privilege is not held by the client
ошибка. Даже если отключить UAC, вы все равно получите ошибку. Имейте в виду, что токен безопасности пользователя рассчитывается только один раз при входе в систему, поэтому, если вы вносите изменения в токен безопасности этого пользователя, им необходимо выйти из системы и снова включиться, чтобы изменения вступили в силу. Но это не беда - все равно изменить системное время без подъема не позволит.
На этом этапе я бы подумал о том, чтобы сделать что-то вроде написания службы Windows или запланированной задачи, которая выполнялась бы как локальная система, с которой обычный пользователь мог бы взаимодействовать каким-либо образом, чтобы управлять системным временем. Совершенно очевидно, что Windows не хотела, чтобы стандартный пользователь возился с системным временем.