Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как узнать время на сервере? / 25 сообщений из 25, страница 1 из 1
04.06.2008, 07:58
    #35352953
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
Уважаемые форумляне.

Сделал я программку, фиксирующую время logon и logout. Т.е. контролирующую начало и конец работы сотрудников нашего офиса.
Так нашелся умелец, который перед логаутом менял время на своем компе на более позднее (чтобы смыться раньше в работы), и перед выключением компа ставил время на полчаса назад, потому утром мог беззастенчиво опаздывать.

Можно ли как-то фиксировать время logon и logout, но не клиентского компа, а самого сервера, к которому такие умельцы доступа не имеют? Чего-то я никак не соображу, с какого угла начинать танцевать.

Тех. данные: на сервере лежит аксессовская база (там фиксируется время), а программка (VB6) стоит на каждой машине и отсылает данные в Access.

Спасибо
...
Рейтинг: 0 / 0
04.06.2008, 08:06
    #35352958
shady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
ACCESS это не совсем то что Вам нужно, переходите например на MSSQL и не будет у Вас таких "умельцев". Можно будет SELECT GetDate() и получится время сервера всегда. А в ACCESS будет всегда время клиента, т.к. в первом случае обрабатывается ядром сервера, во втором локальным драйвером из набора MDAC
...
Рейтинг: 0 / 0
04.06.2008, 08:15
    #35352968
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
Спасибо за оперативный ответ. Жаль, что с аксессом не получится. Не знал. К сожалению, MSSQL у нас в офисе нет, есть только лицензионный Access.
А может, как-то извернуться, чтобы Access сам вписывал время, когда в таблицу добавлялась запись именно от этого клиента?
Есть ли такое событие в VB Access "добавление записи"? Тогда я смог бы навесить на него процедурку и время бы корректировалась в самом Access?
...
Рейтинг: 0 / 0
04.06.2008, 09:17
    #35353048
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
в поиске, по словам BeforeInsert или AfterInsert в нашем подфоруме access найдёте нужное
...
Рейтинг: 0 / 0
04.06.2008, 10:30
    #35353223
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
Спасибо. Только BeforeInsert и AfterInsert работают только с формами, а у меня форм в access-е нет, полько таблицы, которые заполняются через VB-приложение на клиентской машине.
...
Рейтинг: 0 / 0
04.06.2008, 10:50
    #35353311
Hibernate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
4cd6686Спасибо за оперативный ответ. Жаль, что с аксессом не получится. Не знал. К сожалению, MSSQL у нас в офисе нет, есть только лицензионный Access.
А может, как-то извернуться, чтобы Access сам вписывал время, когда в таблицу добавлялась запись именно от этого клиента?
Есть ли такое событие в VB Access "добавление записи"? Тогда я смог бы навесить на него процедурку и время бы корректировалась в самом Access?
насколько я понимаю, все события и процедуры аксеса отрабатывают на клиентской машине. Соответственно, и время тоже будет браться с клиентского компа.
Можете на сервер поставить что-то серверное (тот-же SQL, как тут уже писали), из аксеса дергать это что-то(типа Select GetDate() - выше уже писали), а оно будет возвращать дату сервера.
Можно конечно попробовать и через DCOM что-то наваять, опять-же серверное. Но геморно это - проще бесплатный MSDE поставить и не мучиться - делов-то на 10 минут.
...
Рейтинг: 0 / 0
04.06.2008, 10:59
    #35353346
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
> Автор: 4cd6686
> Уважаемые форумляне.
>
> Сделал я программку, фиксирующую время logon и logout. Т.е.
> контролирующую начало и конец работы сотрудников нашего офиса.
> Так нашелся умелец, который перед логаутом менял время на своем компе
> на более позднее (чтобы смыться раньше в работы), и перед выключением
> компа ставил время на полчаса назад, потому утром мог беззастенчиво
> опаздывать.

Попробуй звать net time /set и синхронизировать время его компьютера со
временем сервера, прежде чем регистрировать что-либо.
Пусть он удивится ;)

> Спасибо
Да не за что, вообще такие умельцы, если не понимают по человечески,
осаждаются административными мерами в виде докладной на имя руководителя,
который ввел фиксацию прихода-ухода и по его распоряжению административное
лишение прав на изменение системного времени. Потому что он может точно
также отбирать у себя права на изменение системного времени, перед выходом и
тогда net time /set не сработает

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
04.06.2008, 11:49
    #35353538
jhonkuk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
в аксе использовал автозаполнение поля дата-время при добавлении новой записи (туда пишется время именно сервера)
...
Рейтинг: 0 / 0
04.06.2008, 13:09
    #35353870
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
Большое спасибо, Игорь Горбонос. Есть на чем подумать и поучиться.
...
Рейтинг: 0 / 0
04.06.2008, 13:12
    #35353880
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
jhonkukв аксе использовал автозаполнение поля дата-время при добавлении новой записи (туда пишется время именно сервера)

А как установить автозаполнение поля время? В свойствах поля не нахожу такого. Если не очень затруднит, напишите поподробней.
Спасибо
...
Рейтинг: 0 / 0
04.06.2008, 13:21
    #35353924
shady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
В конструкторе открыть таблицу и в "значение по умолчанию" написать Now()
...
Рейтинг: 0 / 0
04.06.2008, 13:22
    #35353929
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
у объекта ADODB.Recordset есть событие WillChangeRecord и другие . Подойдёт?
...
Рейтинг: 0 / 0
04.06.2008, 16:23
    #35354518
Dan-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
НАПИСАЛ АНАЛОГИЧНУЮ ПРОГРАММУ. в Экселе на ВБА. Но для одиночного компьютера...
Учитывает опоздания , неучтенные перерывы, дает возможность отработать опоздания, учитывает полные и неполные дни, фиксирует время запуска Экселя и время закрытия, фиксирует факт входа-выхода в основные программы (Экселевские), распечатку документов, которые не положено печатать, сбои электропитания...
Все реализовал на формах, чтобы доступа к файлу не было...

Запретил доступ для Юзера к времени компьютера. Вопрос закрылся сам.

Код: plaintext
1.
Не могу реализовать сброс SMS через мобильный модем встроенный в системный блок.
Не могу реализовать запрос времени через мобильный модем встроенный в системный блок.

Пока в офисах сидят девочки прокатывает, как посадим девочку - хакера, будем "посмотреть"

Есть идея - для топика на Windows
1.фиксировать факт коррекции времени в ЛОГЕ
2.Сделать кнопки OK Отмена Применить - Inhabled на форме "СВОЙСТВА ДАТА И ВРЕМЯ" (но как реализовать не знаю)... Оставить только крестик на TitleBar.
...
Рейтинг: 0 / 0
04.06.2008, 16:33
    #35354552
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
Спасибо всем за помощь.
Действительно, самое простое - это решение от shady.
Просто в клиентской программе убираю строку записи времени login / logout клиента в базу данных, а в Access-е ставлю в поле "время" default = now().
УРАААА!!!

Большое всем спасибо
...
Рейтинг: 0 / 0
04.06.2008, 16:40
    #35354571
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
> Автор: Dan-K
> Есть идея - для топика на Windows
> 1.фиксировать факт коррекции времени в ЛОГЕ

Это делается настройками аудита ;)

> 2.Сделать кнопки OK Отмена Применить - Inhabled на форме "СВОЙСТВА
> ДАТА И ВРЕМЯ" (но как реализовать не знаю)... Оставить только крестик на
> TitleBar.

А это политиками безопастности, правда при этом окно вообще не показывается
;)

Когда-же матчасть будем учить, вместо изобретания велосипеда?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
04.06.2008, 16:49
    #35354608
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
Сорри, не получилось. Даже если access на сервере имеет дефолтное время = Now(), а я никакой команды на изменение его не даю, то он пишет клиентское, а не серверное время.
Убиться :(
...
Рейтинг: 0 / 0
04.06.2008, 17:30
    #35354760
FAndrew
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
Логично. Аксес не серверное приложение, просто его файл лежит на серваке. А если вы его положите на флешку, откуда он должен будет взять время?
...
Рейтинг: 0 / 0
04.06.2008, 18:56
    #35354949
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
FAndrewЛогично. Аксес не серверное приложение, просто его файл лежит на серваке. А если вы его положите на флешку, откуда он должен будет взять время?

Сглупил, признаю.
Придется пытаться реализовывать вариант Игоря Горбоноса с вебовским временем. Если честно, никогда такого не делал. Я ж самоучка.
Не сможет ли кто-нибудь дать ссылки на примеры. Заранее благодарю
...
Рейтинг: 0 / 0
04.06.2008, 19:22
    #35355000
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
> Автор: 4cd6686
> Придется пытаться реализовывать вариант Игоря Горбоноса с вебовским
> временем. Если честно, никогда такого не делал. Я ж самоучка.

Да собственно говоря, я металлург по образованию ;)
Это жизнь.

> Не сможет ли кто-нибудь дать ссылки на примеры. Заранее благодарю

Перед сохранением данных
Dim dt As Date
Запоминаем текущее системное время
dt = Now
Синхронизируем с сервером, если получится по правам
Shell "cmd.exe /c net time \\имя_сервера_где_лежит_база /set /y", vbHide
и я-бы вставил
Sleep(10)
DoEvents
Получение точного времени для сохранения данных
Перевод времени в исходное
Date = dt
Time = dt
Собственно сохранение данных на сервере

Удачи

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
05.06.2008, 10:01
    #35355701
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
Уважаемый Игорь Горбонос, спасибо за пример, но ничего не получается пока.

Dim dt As Date
dt = Now
Shell "cmd.exe /c net time \\хх.хх.хх.хх/set /y", vbHide
Sleep (10)
DoEvents
Date = dt
Time = dt

С правами доступа на хх.хх.хх.хх у меня порядок, код ошибки не выдает, но и время не синхронизирует.
Пожалуйста, добавьте в свой код строку типа, если это возможно:
dNewTime = Время на сервере хх.хх.хх.хх.
Чтобы я мог его и записать в таблицу, потому что время на моей машине не синхронизируется с серверным, хоть убей.
...
Рейтинг: 0 / 0
05.06.2008, 10:44
    #35355836
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
у меня, пример Игоря Горбонос, сработал
Код: plaintext
1.
2.
3.
    Dim name_server As String
    name_server = "Server-1c"
    Shell "cmd.exe /c net time \\" & name_server & " /set /y", vbHide
...
Рейтинг: 0 / 0
05.06.2008, 11:01
    #35355894
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
> Автор: 4cd6686
> Уважаемый Игорь Горбонос, спасибо за пример, но ничего не получается
> пока.
>
> Dim dt As Date
> dt = Now
> Shell "cmd.exe /c net time \\хх.хх.хх.хх /set /y", vbHide

Между именем сервера и /set должен быть пробел.

> Sleep (10)
> DoEvents
> Date = dt
> Time = dt
>
> С правами доступа на хх.хх.хх.хх у меня порядок, код ошибки не
> выдает, но и время не синхронизирует.

Может у тебя на своем компе нет прав на изменение времени? ;)
попробуй набрать это:
net time \\хх.хх.хх.хх /set /y
в командной строке. Ключ /set устанавливает время, а ключ /y говорит
автоматическое ДА на вопрос "А действительно ли мы хотим поменять время?"

> Пожалуйста, добавьте в свой код строку типа, если это возможно:
> dNewTime = Время на сервере хх.хх.хх.хх.
> Чтобы я мог его и записать в таблицу, потому что время на моей машине
> не синхронизируется с серверным, хоть убей.

Добавь модуль и в него вставь код(это немного переделаннный пример из МСДН -
HOWTO: Create a Process for Reading and Writing to a Pipe)
а потом вызывай:
sNewTime = ExecCmd("cmd.exe /c net time \\хх.хх.хх.хх ")
В переменной sNewTime будет строка вида:
Current time at \\имя сервера is 05.06.2008 9:49

Код: plaintext
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.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
Option Explicit

Private Declare Function CreatePipe Lib "kernel32" ( _
    phReadPipe As Long, _
    phWritePipe As Long, _
    lpPipeAttributes As Any, _
    ByVal nSize As Long) As Long

Private Declare Function ReadFile Lib "kernel32" ( _
    ByVal hFile As Long, _
    ByVal lpBuffer As String, _
    ByVal nNumberOfBytesToRead As Long, _
    lpNumberOfBytesRead As Long, _
    ByVal lpOverlapped As Any) As Long

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Type STARTUPINFO
   cb As Long
   lpReserved As Long
   lpDesktop As Long
   lpTitle As Long
   dwX As Long
   dwY As Long
   dwXSize As Long
   dwYSize As Long
   dwXCountChars As Long
   dwYCountChars As Long
   dwFillAttribute As Long
   dwFlags As Long
   wShowWindow As Integer
   cbReserved2 As Integer
   lpReserved2 As Long
   hStdInput As Long
   hStdOutput As Long
   hStdError As Long
End Type

Private Type PROCESS_INFORMATION
   hProcess As Long
   hThread As Long
   dwProcessID As Long
   dwThreadID As Long
End Type

Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
   lpApplicationName As Long, ByVal lpCommandLine As String, _
   lpProcessAttributes As Any, lpThreadAttributes As Any, _
   ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
   ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
   lpStartupInfo As Any, lpProcessInformation As Any) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal _
   hObject As Long) As Long

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const STARTF_USESTDHANDLES = &H100&
Private Const STARTF_USESHOWWINDOW = &H1

Private Const SW_HIDE =  0 

Public Function ExecCmd(cmdline$) As String
    Dim proc As PROCESS_INFORMATION, ret As Long, bSuccess As Long
    Dim start As STARTUPINFO
    Dim sa As SECURITY_ATTRIBUTES, hReadPipe As Long, hWritePipe _
    As Long
    Dim bytesread As Long, mybuff As String
    Dim i As Integer
    ExecCmd = ""

    mybuff = String( 256 , Chr$( 65 ))

    sa.nLength = Len(sa)
    sa.bInheritHandle =  1 &
    sa.lpSecurityDescriptor =  0 &

    ret = CreatePipe(hReadPipe, hWritePipe, sa,  0 )
    If ret =  0  Then
        MsgBox "CreatePipe failed. Error: " & Err.LastDllError
        Exit Function
    End If

 start.cb = Len(start)
 start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
 start.hStdOutput = hWritePipe
 start.wShowWindow = SW_HIDE

 ' Start the shelled application:
 ret& = CreateProcessA( 0 &, cmdline$, sa, sa,  1 &, _
 NORMAL_PRIORITY_CLASS,  0 &,  0 &, start, proc)
 If ret <>  1  Then
     MsgBox "CreateProcess failed. Error: " & Err.LastDllError
 End If

 bSuccess = ReadFile(hReadPipe, mybuff,  100 , bytesread,  0 &)
 If bSuccess =  1  Then
     ExecCmd = Left(mybuff, bytesread)
'     List1.AddItem ExecCmd
 Else
     MsgBox "ReadFile failed. Error: " & Err.LastDllError
 End If

    ret& = CloseHandle(proc.hProcess)
    ret& = CloseHandle(proc.hThread)
    ret& = CloseHandle(hReadPipe)
    ret& = CloseHandle(hWritePipe)
End Function

Private Sub CommandButton1_Click()
' Для теста
Debug.Print ExecCmd("cmd.exe /c net time \\127.0.0.1 /y")
End Sub



Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
05.06.2008, 13:57
    #35356611
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
Еще раз спасибо, что не оставляете без помощи.

1. net time \\IP сервера /set /y. Работает: поменял на компе время и дату, прогнал эту команду, все восстановилось, как на сервере. Значит, тут порядок.

2. Сделал, как было сказано.
ЗАРАБОТАЛО!!!!!!

Все, проблема решена. Теперь все логины и логауты пишутся с серверным временем. Проверено на нескольких машинах.
Огромная признательность всем и персонально Игорю :)
...
Рейтинг: 0 / 0
05.06.2008, 14:17
    #35356714
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
> Автор: 4cd6686
> Еще раз спасибо, что не оставляете без помощи.
>
> 1. net time \\IP сервера /set /y. Работает: поменял на компе время и
> дату, прогнал эту команду, все восстановилось, как на сервере. Значит, тут
> порядок.

Если IP динамический, назначаемый сервером DHCP, то когда нибудь IP может
изменится, при правильно настроенной сетке с DNS-server'ом лучше
использовать имя компьютера, это из общения с сисадминами. Если адреса
статические, тогда лучше использовать IP адрес.

>
> 2. Сделал, как было сказано.
> ЗАРАБОТАЛО!!!!!!
>
> Все, проблема решена. Теперь все логины и логауты пишутся с серверным
> временем. Проверено на нескольких машинах.

Ну и чудесненько ;)

Удачи

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
05.06.2008, 15:19
    #35356966
4cd6686
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать время на сервере?
авторЕсли IP динамический, назначаемый сервером DHCP, то когда нибудь IP может
изменится, при правильно настроенной сетке с DNS-server'ом лучше
использовать имя компьютера, это из общения с сисадминами. Если адреса
статические, тогда лучше использовать IP адрес.

Нет, айпи статический. Так что проблем быть не должно, а на будущее учту
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как узнать время на сервере? / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]