15

有没有办法在 Windows 10 IoT Core Insider Preview 中从我在 Raspberry Pi 2 上运行的应用程序设置系统时间?

这不适用于缺少 kernel32.dll

    [DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
    extern static bool Win32SetSystemTime(ref SystemTime sysTime);
4

8 回答 8

11

首先,使用 PowerShell 连接到您的 Pi 2

使用命令set-date设置时间。例如,如果要将日期设置为 2015 年 10 月 3 日星期六下午 2:00,您可以键入set-date 10/3/2015 2:00PM.

该命令tzutil设置时区。tzutil /?使用类型

于 2015-10-03T18:02:13.587 回答
7

1-新建通用项目
2-添加参考>扩展>适用于 UWP
的 Windows IOT 扩展 3-在 MainPage.xaml

private void buttonSetSystemDatetime_Click(object sender, RoutedEventArgs e)
        {
            DateTimeOffset dto = datePicker1.Date+ timePicker1.Time;
            Windows.System.DateTimeSettings.SetSystemDateTime(dto);
        }

4-在项目设置中>设置您的目标版本和最低版本10.0;构建 16299
5-双击 appxmanifest > 功能 > 选中“系统管理”

6- 在 IOT 中运行应用程序并按下按钮。而不是返回默认应用程序。瞧!系统日期时间已更改。

注意:而不是每次都设置它。我建议您购买便宜的 rtc(实时时钟)模块。(也需要额外的编码)

于 2017-12-19T09:30:16.963 回答
4

您可以在 UWP/IoT-Core 系统上从 C# 调用任何 PowerShell 例程。因此,PowerShell 命令始终在您的应用程序中可用。

有关示例,请参阅GitHub 上的 ProcessLauncher 示例

替代方案,按如下方式安排启动 PS 脚本:

在板上以管理员身份运行 PowerShell(按 Windows 按钮,然后开始键入 PowerShell,右键单击图标并选择“以管理员身份运行”)。

Set-ExecutionPolicy RemoteSigned

PuTTy 以管理员身份添加到 RPi,并且:

setx PATH "%PATH%;C:\Windows\System32"

schtasks /create /tn "StartupPowerShell" /tr c:\Startup.bat /sc onstart /ru SYSTEM

启动.bat

powershell -command "C:\IotCoreStartup.ps1"

物联网核心启动.ps

$logFile = 'C:\StartupLog.txt'

get-date > $logFile

tzutil /s "UTC" >> $logFile

# set alternate time servers
"Setting additional time servers" >> $logFile
w32tm /config /syncfromflags:manual /manualpeerlist:"0.windows.time.com 1.pool.ntp.org" >> $logFile

如果需要,删除计划任务:

schtasks /Delete /TN "StartupPowerShell"

运行计划任务是否进行测试:

schtasks /Run /tn "StartupPowerShell"

于 2015-11-24T19:23:00.470 回答
3

似乎到目前为止似乎没有办法实际编辑系统时间,但这是我想出的一种解决方法,至少可以在您的应用程序中获得正确的时间。我创建了一个 TimeManager 类,重要部分如下。

获取您想要的正确时间(例如 NTP、其他网络时间、用户输入等)并输入到 UpdateOffset 方法中。

在应用程序的其余部分使用 TimeManager.Now 而不是 DateTime.Now

    static TimeSpan _offset = new TimeSpan(0,0,0);
    public static TimeSpan CurrentOffset //Doesn't have to be public, it is for me because I'm presenting it on the UI for my information
    {
        get { return _offset; }
        private set { _offset = value; }
    }

    public static DateTime Now
    {
        get
        {
            return DateTime.Now - CurrentOffset;
        }
    }

    static void UpdateOffset(DateTime currentCorrectTime) //May need to be public if you're getting the correct time outside of this class
    {
        CurrentOffset = DateTime.UtcNow - currentCorrectTime;
        //Note that I'm getting network time which is in UTC, if you're getting local time use DateTime.Now instead of DateTime.UtcNow. 
    }

我还建议添加诸如跟踪上次更新时间之类的内容,并标记以指示时间是否已更新,只是不想弄乱代码示例。

于 2015-06-04T14:48:12.703 回答
3

我使用 RTC 在我的 Raspberry Pi 上设置时间。虽然 Windows-iot 不支持从实时时钟初始化 Raspberry Pi 的软件时钟,但在考虑了几个小时后,我发现了一些适合我的方法。

我制作了一个控制台程序,可以将系统时间保存到 RTC 或读取 RTC 中的时间并将其打印为字符串。我制作了一个 power shell 脚本,它将在系统启动时运行该程序,以从实时时钟获取时间并将字符串传递给 set-date 命令。

详细信息在这里: http: //www.codeproject.com/Articles/1113626/Adding-the-Missing-Real-Time-Clock-to-Windows-IoT

于 2016-07-21T02:59:24.897 回答
2

使用 Renci SSH shell 以管理员身份重新登录设备,然后使用 powershell 命令设置日期和时间。

public static int SshCommand(string command, out string dataOut, out string error)
    {

        dataOut = "";
        error = "";

        try
        {

            using (var client = new SshClient("127.0.0.1", USER_NAME, PASSWORD))
            {
                client.Connect();
                //command = "powershell -Command " + "\u0022" + "set-date -date '8/10/2017 8:30:00 AM'" + "\u0022";
                //command = "netsh interface ip show config";
                var cmd = client.RunCommand(command);
                var output = cmd.Result;
                client.Disconnect();
            }

            return 1;
        }
        catch (Exception ex)
        {
            error = ex.Message;
            return 0;
        }

    }


public static int SSHSetDateTime(DateTime dateTime)
    {

        // Variables
        int returnValue = 0;
        string command;
        string error;
        string dataOut;

        // Build date
        command = String.Format("powershell -Command \u0022set-date -date '{0:M/d/yyyy H:mm:ss tt}'\u0022", dateTime);

        //Build date
        if (SystemEx.SshCommand(command, out dataOut, out error) == 1)
        {
            // Ok
            returnValue = 1;
        }

        // Return
        return returnValue;

    }
于 2017-01-19T08:06:38.010 回答
1

请参阅 Microsoft API 参考文档,在Windows.System命名空间中,您可以使用SetSystemDateTime方法设置系统日期和时间。

但你必须知道它可以在

  • Windows IoT Extension SDK(引入v10.0.16225.0)及以上

你可以使用 DateTimeSettings 静态类

public static class DateTimeSettings

然后调用 SetSystemDateTime 静态方法并发送 DateTimeOffset 类型的对象以在 Windows Iot 上设置日期和时间。

public static void SetSystemDateTime(DateTimeOffset utcDateTime)

https://docs.microsoft.com/en-us/uwp/api/windows.system.datetimesettings

于 2017-08-01T05:25:37.093 回答
1

我知道您在问如何以编程方式执行此操作,但是,以下内容应提供足够的信息来创建一个在启动时运行的 PS 脚本。

通过 Powershell 远程访问 Raspberry Pi

1.) 在您的开发 PC 上运行 Windows 10 IoT Core Watcher 实用程序 (C:\Program Files (x86)\Microsoft IoT\WindowsIoTCoreWatcher.exe) 并通过右键单击检测到的设备并选择复制来复制您的 Raspberry Pi IP 地址IP地址。

◦单击窗口“开始”按钮

◦键入“WindowsIoTCoreWatcher”以在搜索结果中将其拉出

◦您可能需要右键单击程序名称并选择“固定到开始”以将其固定到您的开始屏幕以便于访问

◦按 Enter 运行它

◦您的设备应在 5 秒左右出现在列表中。如果没有,请关闭 Windows 10 IoT Core Watcher,然后重新启动它

Windows IoT 核心观察程序

2.) 在本地 PC 上启动管理员 PowerShell 控制台。最简单的方法是在 Windows 开始菜单附近的搜索网络和 Windows 文本框中键入“powershell”。Windows 将在您的计算机上找到 PowerShell。右键单击 Windows PowerShell 条目并选择以管理员身份运行。PS控制台将显示。

以管理员身份运行 Powershell

3.) 您可能需要在桌面上启动 WinRM 服务以启用远程连接。从 PS 控制台键入以下命令:

 net start WinRM 

4.) 在 PS 控制台中,键入以下命令,将 '' 替换为 prev 中复制的 IP 值:

 Set-Item WSMan:\localhost\Client\TrustedHosts -Value <machine-name or IP Address>

5.键入 Y 并按 Enter 确认更改。

6.现在您可以开始与您的 Windows IoT Core 设备的会话。在您的管理员 PS 控制台中,键入:

Enter-PSSession -ComputerName <IP Address> -Credential localhost\Administrator

7.在凭据对话框中输入以下默认密码:

p@ssw0rd

注意:连接过程不是立即的,最多可能需要 30 秒。

如果您成功连接到设备,您应该会在提示前看到设备的 IP 地址。

使用 PS 连接到树莓派

重命名您的设备并设置日期和时间

1.要更改计算机名称,请使用 setcomputername 实用程序。在 PowerShell 中,键入以下命令。

设置计算机名

2. Pi 上的日期和时间必须正确,以便稍后在实验室中发布到 Azure 的安全令牌有效。要检查 Pi 上的当前时区设置,请键入:

tzutil /g

3.如果报告的时区不正确,您可以使用以下方法查找有效时区列表(您可能需要在您的 powershell 窗口中增加缓冲区大小):

tzutil /l

4.要设置时区,从上面的步骤中找到你想要的时区的id,然后使用:

tzutil /s "你的时区名称"

例如,对于“太平洋标准时间”

tzutil /s "太平洋标准时间"

5.要检查树莓派上的日期,输入

获取日期

6.如果日期或时间不正确,请使用 Set-Date 实用程序

设置日期“mm/dd/yy hh:mm:ss AM/PM”

例如,如果是 2016 年 1 月 3 日下午 12:15:

设置日期“01/03/16 12:15 PM”

7.重新启动设备以使更改生效。您可以按如下方式使用关闭命令:

关机 /r /t 0

于 2016-03-11T16:13:40.430 回答