如何获取不依赖于系统日期时间和无需互联网的当前日期时间
本文关键字:时间 互联网 当前日期 日期 系统 何获取 获取 依赖于 | 更新日期: 2023-09-27 18:29:21
如何在Windows应用程序中使用c#获取不依赖于系统日期时间和NO的当前日期时间
您已经知道答案了。无法完成。
所以你需要改变你的策略。
如何发现是否有人在作弊?
您需要创建一个可以用作引用的文件。首先尝试一下,如果需要的话,你可以让这种方法更难检测,也更难让用户克服。
当你安装程序时,创建一个文件,让内容是根据系统时间的随机日期后的秒数。现在,一旦你运行了你的程序,请检查以确保时钟没有从那时开始倒退。如果有,问题!!!!,如果没有,请再次更新文件。
这里的关键是向你认为会欺骗你的用户隐藏这个文件。您可以将信息隐藏在注册表中,或者作为其他文件的一部分。希望当用户意识到你存储的是他上次运行的时间时,他将无法弄清楚你是如何存储上次运行的,也无法向后设置标志。
这个系统似乎很容易被击败,但前提是最终用户知道你在做这件事,知道你存储信息的每个地方(将信息存储在三个不同的文件中,包括c:''temp),并确切知道你是如何加密它最后运行的日期的。我不知道你的观众,但我敢打赌,你试图阻止一个青少年永远使用试用版,一旦系统相当复杂(需要5分钟以上才能击败),你就相当安全了。
你可以做的另一件事是,当你检测到最终用户可能作弊时,开始删除程序的部分内容,这样它就不会再运行了。
答案是你不能。如果你没有从系统或互联网上选择时间,那么就无法获得当前的日期时间。
实际上,我不知道为什么不能使用系统时间。如果您认为它可能不精确,并且用户需要设置它,那么当然可以从代码中完成。以下片段显示了如何从C#设置系统代码:
[Serializable]
[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
[MarshalAs(UnmanagedType.U2)]
public short Year;
[MarshalAs(UnmanagedType.U2)]
public short Month;
[MarshalAs(UnmanagedType.U2)]
public short DayOfWeek;
[MarshalAs(UnmanagedType.U2)]
public short Day;
[MarshalAs(UnmanagedType.U2)]
public short Hour;
[MarshalAs(UnmanagedType.U2)]
public short Minute;
[MarshalAs(UnmanagedType.U2)]
public short Second;
[MarshalAs(UnmanagedType.U2)]
public short Milliseconds;
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetSystemTime(
[In] ref SystemTime lpSystemTime);
/// <summary>
/// Set the system time to the given date/time.
/// The time must be given in utc.
/// </summary>
/// <param name="dt">Date/time to set the system clock to</param>
/// <returns>True on success, false on failure. This fails if the current user has insufficient rights to set the system clock. </returns>
/// <remarks>This method needs administrative priviledges to succeed.</remarks>
public static bool SetSystemTimeUtc(DateTime dt)
{
bool bSuccess = false;
if (dt.Year >= 2100) // limit the year to prevent older C-routines to crash on the local time
{
dt = new DateTime(2099, dt.Month, dt.Day);
}
SystemTime st = DateTimeToSystemTime(dt);
try
{
bSuccess = SetSystemTime(ref st);
}
catch (System.UnauthorizedAccessException)
{
bSuccess = false;
}
catch (System.Security.SecurityException)
{
bSuccess = false;
}
return bSuccess;
}
private static SystemTime DateTimeToSystemTime(DateTime dt)
{
SystemTime st;
st.Year = (short)dt.Year;
st.Day = (short)dt.Day;
st.Month = (short)dt.Month;
st.Hour = (short)dt.Hour;
st.Minute = (short)dt.Minute;
st.Second = (short)dt.Second;
st.Milliseconds = (short)dt.Millisecond;
st.DayOfWeek = (short)dt.DayOfWeek;
return st;
}
如上面的注释所示,此方法需要用户是管理员,否则将失败。