Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Полный 30h
Эксперт быдлокодинга
1533 / 446 / 61
Регистрация: 04.11.2010
Сообщений: 1,219
1

Как получить права (коррекция времени)

26.03.2014, 20:11. Просмотров 866. Ответов 5
Метки нет (Все метки)

Приветствую. При написании программы изменяющей время системы (Windows 7x64) возникла следующая ситуация. При подготовке, а именно - права, доступы, привилегии, единый проездной, всё идёт пучком. Однако при непосредственном исполнении SetLocalTime система включает тупого и выдаёт код ошибки 1314 - не хватает прав, иди пешком.

При этом если запускать программу от имени администратора, то время без проблем меняется. Более того, весь код по запросу прав и привелегий вообще можно нахрен выкинуть, всё равно выставит время какое попросишь.

Однако при этом вся эта шняга перестаёт работать из автозагрузки при старте. А мне как раз таки надо что бы всё это работало автономно т.е. без выскакивания всяких окон про "подтвердить" что я в здравом уме и твёрдой памяти при завещании и ведаю что творю.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
format PE GUI 4.0
entry Start
include 'win32a.inc'
 
struct LUID 
  lowPart  dd ? 
  HighPart dd ? 
ends 
  
struct LUID_AND_ATTRIBUTES 
  pLuid       LUID 
  Attributes  dd ? 
ends 
  
struct _TOKEN_PRIVILEGES 
  PrivilegeCount   dd ? 
  Privileges       LUID_AND_ATTRIBUTES 
ends
 
TOKEN_ADJUST_PRIVILEGES = 20h 
TOKEN_QUERY             = 8h 
SE_PRIVILEGE_ENABLED    = 2h
 
struct SYSTIME       ; время для установки
  wYear     dw 2014
  wMonth    dw 3
  wDayOfWeek    dw 1
  wDay      dw 24
  wHour     dw 12
  wMinute   dw 34
  wSecond   dw 56
  wMilliseconds dw 0
ends
 
section '.text' code readable executable
 
Start:
    invoke   GetCurrentProcess ; получить псевдодескриптор процесса
         cmp EAX,-1
         jne Error  
    invoke   OpenProcessToken,EAX,TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY,H_token  ; открыть доступ
         cmp EAX,0
         je  Error 
;-------------------------------------------------------------------------------    
    invoke   LookupPrivilegeValue, NULL,SE_SYSTEMTIME_NAME,udtLUID  ; идентификатор для времени 
         cmp EAX,0
         je  Error  
;-------------------------------------------------------------------------------
         mov [tkp.PrivilegeCount],1
         mov [tkp.Privileges.Attributes],SE_PRIVILEGE_ENABLED
         mov EAX,[udtLUID.lowPart]
         mov [tkp.Privileges.pLuid.lowPart],EAX 
         mov EAX,[udtLUID.HighPart]
         mov [tkp.Privileges.pLuid.HighPart],EAX
;-------------------------------------------------------------------------------
    invoke   AdjustTokenPrivileges,[H_token],0,tkp,0,0,0 ; получить привилегии процесса               
         cmp EAX,0
         je  Error 
;-------------------------------------------------------------------------------
    invoke   SetLocalTime,systim   ; устанавливает дату и время текущей операционной системы
         cmp EAX,0                 ; если ошибка
         je  Error                 ; показать
Ok:           
    invoke MessageBox, NULL,Mes_ok,Mes_title,MB_OK
Exit:
    invoke ExitProcess,0
Error:  
    invoke  GetLastError          ; получить код ошибки
        call MesErr  ; код ошибки в строку
    invoke MessageBox, NULL,Mes_Err,NULL,MB_ICONERROR+MB_OK
        jmp Exit
 
;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
    proc MesErr  ; ПП код ошибки в строку
         mov ESI,Mes_Err+16
         mov EBX,10
         mov ECX,EBX
@@:
       xor EDX,EDX
       div EBX
       add DL,30h
       mov [ESI],DL
       dec ESI
       loop @R
      ret      
    endp 
;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№  
         
section '.data' data readable writeable
udtLUID  LUID
tkp     _TOKEN_PRIVILEGES
systim SYSTIME ; вводимое время
H_token dd 0
 
SE_SYSTEMTIME_NAME db 'SeSystemtimePrivilege',0 
 
  Mes_title db 'SysTime', 0
  Mes_ok db 'Всё хорошо', 0
  Mes_Err db 'Ошибка 0000000000',0,0
 
section '.idata' import data readable writeable
 
  library kernel32, 'KERNEL32.DLL',user32, 'USER32.DLL', advapi32,'ADVAPI32.DLL'
 
  include 'api\kernel32.inc'
  include 'api\user32.inc'
  include 'api\ADVAPI32.INC'

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 20:11
Ответы с готовыми решениями:

2-10 коррекция
хто має якісь накидки на 2-10 корекцію:)

Коррекция опционального заголовка
Народ подскажите как правильно скоректировать размер образа в хеде после...

Коррекция времени RTC в STM32F103
Всем привет, кто использовал коррекцию времени на часах в STM32F103? Меняю...

Коррекция вводимых данных в реальном времени
Здравствуйте друзья! Подскажите пожалуйста написать условие проверки....

Как получить права администратора?
Все привет. Предположим, что открыт TotalCommander по администратором. Как из...

5
Убежденный
Ушел с форума
Эксперт С++
16128 / 7275 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
26.03.2014, 21:37 2
Цитата Сообщение от Полный 30h Посмотреть сообщение
Однако при этом вся эта шняга перестаёт работать из автозагрузки при старте. А мне как раз таки надо что бы всё это работало автономно т.е. без выскакивания всяких окон про "подтвердить" что я в здравом уме и твёрдой памяти при завещании и ведаю что творю.
В Windows права на изменение системного времени есть только у
администраторов и некоторых системных субъектов. Поэтому тут вариантов
не много - или запрашивать администраторские права (что в сочетании с
автозагрузкой приводит к скорому выводу пользователя из состояния
спокойствия), или менять время из службы, у которой эти права есть,
или создать для этого задание планировщика. Или (на худой конец) дать
права на изменение времени нужным пользователям или группам (через
политики безопасности), но это как совсем последняя мера.
1
Полный 30h
Эксперт быдлокодинга
1533 / 446 / 61
Регистрация: 04.11.2010
Сообщений: 1,219
26.03.2014, 21:48  [ТС] 3
Цитата Сообщение от Убежденный Посмотреть сообщение
Или (на худой конец) дать
права на изменение времени нужным пользователям или группам (через
политики безопасности).
Да там и есть то один пользователь. Правда не очень сознательный в плане режима дня. Т.е. я могу каким то образом в настройках винды "через политику безопасности" добавить прав на изменение времени запущенной через автозагрузку прогой? Я просто не очень врубаюсь почему, то что может любой дурак сделать кликнув мышью по часам быть недоступно для программы. В чём тут прикол? Ведь эта прога заменой парой строк может к примеру вырубать комп без каких либо ухищрений, но это политику безопасности винды ни капли не беспокоит.

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
или менять время из службы, у которой эти права есть
Можно ещё эту мысль поразвёрнутей?
0
Убежденный
Ушел с форума
Эксперт С++
16128 / 7275 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
26.03.2014, 22:06 4
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от Полный 30h Посмотреть сообщение
Я просто не очень врубаюсь почему, то что может любой дурак сделать кликнув мышью по часам быть недоступно для программы. В чём тут прикол?
Программа может делать лишь то, что прописано в правах у пользователя,
который ее запустил. Если у пользователя нет прав на изменение времени,
то и у программы, запущенной от его имени, их не будет. И наоборот.

До прихода Windows Vista и UAC все было просто - если пользователь
входит в "Администраторы", у него эти права есть, если нет - тогда нет.
На Vista и выше все немного иначе. Пользователь может быть администратором,
но при этом программы, которые он запускает, если явно не указано иное или
не отключен UAC, получают "урезанные" права. Набор прав соответствует
обычному пользователю (standard user).

Для пробы:

1) Берем Windows XP, создаем нового пользователя, заходим под
ним в систему, пробуем менять время. Облом-с.

2) На Windows Vista, Windows 7 или выше (при включенном UAC)
заходим в настройки времени (по щелчку на часиках в трее),
находим в окне настроек кнопку "изменить дату и время",
видим, что она отмечена UAC-щитом. Т.е. будет запрошено
повышение прав до администратора.

Цитата Сообщение от Полный 30h Посмотреть сообщение
Можно ещё эту мысль поразвёрнутей?
Написать службу, которая в нужный момент будет менять время.
У служб LocalSystem (оно же "SYSTEM") полный контроль над системой,
они могут творить все, что угодно, и безопасность им не указ.
2
Полный 30h
Эксперт быдлокодинга
1533 / 446 / 61
Регистрация: 04.11.2010
Сообщений: 1,219
26.03.2014, 22:08  [ТС] 5
Убежденный, Спасибо за ответ, буду вникать.
0
Полный 30h
Эксперт быдлокодинга
1533 / 446 / 61
Регистрация: 04.11.2010
Сообщений: 1,219
27.03.2014, 00:03  [ТС] 6
Убежденный, попробовал политику безопасности (в силу своих способностей) результат отрицательный. Хотя мышью могу хоть к Алисе Селезнёвой комп отправить.
Как получить права (коррекция времени)

Буду ковырять второй вариант.
0
27.03.2014, 00:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 00:03

Как получить root права?
Стыкнулся с такой проблемкой. Дело в том, что все програмы с плей маркета по...

Как получить права администратора
Всем доброго времени суток!Как можно получить права администратора через...

Как получить права админа в WINXP?
Всем привет. Как получить права админа в WINXP? Знаю этот вопрос уже был и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru