Получение даты перевода часов. - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, не получается получить правильный день перевода часов на летнее/стандартное время через WinAPI. Месяц возвращается верный, а день — нет. GetTimeZoneInformation SetTimeZoneInfomation
Листинг программы
  1. public static TimeZoneInformation GetTimeZoneInformation()
  2. {
  3. var tzi = new TimeZoneInformation();
  4. Kernel.GetTimeZoneInformation(ref tzi);
  5. // Установка параметров перевода (по докам MSDN)
  6. tzi.StandardDate.wHour = 3;
  7. tzi.StandardDate.wDayOfWeek = 4;
  8. tzi.StandardDate.wMonth = 10;
  9. tzi.StandardDate.wDay = 4;
  10. tzi.DaylightDate.wHour = 2;
  11. tzi.DaylightDate.wDayOfWeek = 0;
  12. tzi.DaylightDate.wMonth = 4;
  13. tzi.DaylightDate.wDay = 3;
  14. // Сохранение данных перевода.
  15. WinAPI.SetTimeZoneInfomation(tzi);
  16. var info = new TimeZoneInformation();
  17. Kernel.GetTimeZoneInformation(ref info);
  18. // Структура с данными перевода часов.
  19. return info;
  20. }
  21. public static void SetTimeZoneInfomation(TimeZoneInformation tzi)
  22. {
  23. // Установка привилегий.
  24. var tkp = new TOKEN_PRIVILEGES
  25. {
  26. PrivilegeCount = 1,
  27. Privileges = new LUID_AND_ATTRIBUTES[1] {
  28. new LUID_AND_ATTRIBUTES { Attributes = SE_PRIVILEGE_ENABLED }
  29. }
  30. };
  31. var hToken = new IntPtr();
  32. Advapi.OpenProcessToken(Advapi.GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out hToken);
  33. Advapi.LookupPrivilegeValue("", SE_TIME_ZONE_NAME, out tkp.Privileges[0].Luid);
  34. Advapi.AdjustTokenPrivileges(hToken, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero);
  35. // Установка даты.
  36. Kernel.SetTimeZoneInformation(ref tzi);
  37. // Сброс привилегий.
  38. tkp.Privileges[0].Attributes = 0;
  39. Advapi.AdjustTokenPrivileges(hToken, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero);
  40. }
  41.  
  42. class Kernel
  43. {
  44. [DllImport("kernel32.dll", SetLastError = true)]
  45. public static extern uint GetTimeZoneInformation(ref TimeZoneInformation lpTimeZoneInformation);
  46.  
  47. [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  48. public static extern bool SetTimeZoneInformation(ref TimeZoneInformation lpTimeZoneInformation);
  49. }
  50.  
  51. class Advapi
  52. {
  53. [DllImport("Advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  54. public static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, int BufferLength, IntPtr PreviousState, IntPtr ReturnLength);
  55.  
  56. [DllImport("advapi32.dll", SetLastError = true)]
  57. [return: MarshalAs(UnmanagedType.Bool)]
  58. public static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);
  59.  
  60. [DllImport("kernel32.dll")]
  61. public static extern IntPtr GetCurrentProcess();
  62.  
  63. [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
  64. [return: MarshalAs(UnmanagedType.Bool)]
  65. public static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, out LUID lpLuid);
  66. }

Решение задачи: «Получение даты перевода часов.»

textual
Листинг программы
  1. using System;
  2. using System.ComponentModel;
  3. using System.Runtime.InteropServices;
  4.  
  5. namespace Test
  6. {
  7.     class Program
  8.     {
  9.         struct SYSTEMTIME
  10.         {
  11.             public ushort wYear;
  12.             public ushort wMonth;
  13.             public ushort wDayOfWeek;
  14.             public ushort wDay;
  15.             public ushort wHour;
  16.             public ushort wMinute;
  17.             public ushort wSecond;
  18.             public ushort wMilliseconds;
  19.         }
  20.  
  21.         [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Unicode )]
  22.         struct TIME_ZONE_INFORMATION
  23.         {
  24.             public int Bias;
  25.             [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 32 )]
  26.             public string StandardName;
  27.             public SYSTEMTIME StandardDate;
  28.             public int StandardBias;
  29.             [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 32 )]
  30.             public string DaylightName;
  31.             public SYSTEMTIME DaylightDate;
  32.             public int DaylightBias;
  33.         }
  34.  
  35.         [DllImport( "kernel32.dll", SetLastError = true )]
  36.         static extern uint GetTimeZoneInformation (
  37.             out TIME_ZONE_INFORMATION lpTimeZoneInformation
  38.             );
  39.  
  40.         [DllImport( "kernel32.dll", SetLastError = true )]
  41.         [return: MarshalAs( UnmanagedType.Bool )]
  42.         static extern bool SetTimeZoneInformation (
  43.             ref TIME_ZONE_INFORMATION lpTimeZoneInformation
  44.             );
  45.  
  46.         public static void Main ( ) {
  47.             Privileges.Enable( "SeTimeZonePrivilege" );
  48.             TIME_ZONE_INFORMATION tzi;
  49.             int err = 0;
  50.  
  51.             GetTimeZoneInformation( out tzi );
  52.  
  53.             tzi.StandardDate.wHour = 3;
  54.             tzi.StandardDate.wDayOfWeek = 4;
  55.             tzi.StandardDate.wMonth = 10;
  56.             tzi.StandardDate.wDay = 4;
  57.  
  58.             tzi.DaylightDate.wHour = 2;
  59.             tzi.DaylightDate.wDayOfWeek = 0;
  60.             tzi.DaylightDate.wMonth = 4;
  61.             tzi.DaylightDate.wDay = 3;
  62.  
  63.             if ( !SetTimeZoneInformation( ref tzi ) )
  64.                 throw new Win32Exception( err = Marshal.GetLastWin32Error() );
  65.             GetTimeZoneInformation( out tzi );
  66.             // Меняется, при первом использовании, потом ясное дело - нет.
  67.             Debugger.Break();
  68.         }
  69.     }
  70.  
  71.     class Privileges
  72.     {
  73.         [StructLayout( LayoutKind.Sequential, Pack = 1 )]
  74.         struct TOKEN_PRIVILEGES
  75.         {
  76.             public uint PrivilegeCount;
  77.             public long Luid;
  78.             public uint Attributes;
  79.         }
  80.  
  81.         [DllImport( "advapi32.dll", SetLastError = true )]
  82.         [return: MarshalAs( UnmanagedType.Bool )]
  83.         static extern bool AdjustTokenPrivileges ( IntPtr htok, bool disall,
  84.         ref TOKEN_PRIVILEGES newst, int len, IntPtr prev, IntPtr relen );
  85.  
  86.         [DllImport( "kernel32.dll", SetLastError = true )]
  87.         static extern IntPtr GetCurrentProcess ( );
  88.  
  89.         [DllImport( "advapi32.dll", SetLastError = true )]
  90.         [return: MarshalAs( UnmanagedType.Bool )]
  91.         static extern bool OpenProcessToken ( IntPtr h, int acc, ref IntPtr
  92.         phtok );
  93.  
  94.         [DllImport( "advapi32.dll", SetLastError = true )]
  95.         [return: MarshalAs( UnmanagedType.Bool )]
  96.         static extern bool LookupPrivilegeValue ( string host, string name,
  97.         ref long pluid );
  98.  
  99.         const int SE_PRIVILEGE_ENABLED = 0x00000002;
  100.         const int TOKEN_QUERY = 0x00000008;
  101.         const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
  102.  
  103.         [DllImport( "kernel32.dll", SetLastError = true )]
  104.         [return: MarshalAs( UnmanagedType.Bool )]
  105.         static extern bool CloseHandle ( IntPtr hObject );
  106.  
  107.         public static bool Enable ( string PrivName ) {
  108.             TOKEN_PRIVILEGES tp = new TOKEN_PRIVILEGES();
  109.             IntPtr hToken = IntPtr.Zero;
  110.             bool retVal = false;
  111.  
  112.             if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref hToken ) )
  113.                 return false;
  114.  
  115.             if ( LookupPrivilegeValue( null, PrivName, ref tp.Luid ) ) {
  116.  
  117.                 tp.PrivilegeCount = 1;
  118.                 tp.Attributes = SE_PRIVILEGE_ENABLED;
  119.  
  120.                 retVal = AdjustTokenPrivileges( hToken, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero );
  121.             }
  122.             CloseHandle( hToken );
  123.             return false;
  124.         }
  125.     }
  126. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.714 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы