如何获取不依赖于系统日期时间和无需互联网的当前日期时间

本文关键字:时间 互联网 当前日期 日期 系统 何获取 获取 依赖于 | 更新日期: 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;
}

如上面的注释所示,此方法需要用户是管理员,否则将失败。