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 に答える
4

UWP/IoT-Core システムでは、C# から任意の PowerShell ルーチンを呼び出すことができます。そのため、PowerShell コマンドは常にアプリ内/アプリで利用できます。

例については、 GitHubの ProcessLauncher サンプルを参照してください。

別の方法として、次のように起動 PS スクリプトをスケジュールします。

ボード上で管理者として PowerShell を実行します (Windows ボタンを押して PowerShell と入力し始め、アイコンを右クリックして [管理者として実行] を選択します)。

Set-ExecutionPolicy RemoteSigned

管理者としての RPi への PuTTY および:

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

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

Startup.bat

powershell -command "C:\IotCoreStartup.ps1"

IotCoreStartup.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 メソッドに入力します。

アプリの残りの部分では、DateTime.Now の代わりに TimeManager.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 に答える
2

Renci SSH シェルを使用してデバイスに管理者として再度サインインし、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

プログラムでこれを行う方法を尋ねていることは承知していますが、起動時に実行する PS スクリプトを作成するのに十分な情報を以下に示します。

Powershell 経由で Raspberry Pi にリモート アクセス

1.) 開発用 PC で Windows 10 IoT Core Watcher ユーティリティ (C:\Program Files (x86)\Microsoft IoT\WindowsIoTCoreWatcher.exe) を実行し、検出されたデバイスを右クリックして [コピー] を選択して、Raspberry Pi の IP アドレスをコピーします。 IPアドレス。

◦Windowsの「スタート」ボタンをクリック

◦「WindowsIoTCoreWatcher」と入力すると、検索結果に表示されます

◦ プログラム名を右クリックして [スタートにピン留め] を選択すると、簡単にアクセスできるようにスタート画面にピン留めできます。

◦ Enter を押して実行します

◦ デバイスが 5 秒ほどでリストに表示されます。そうでない場合は、Windows 10 IoT Core Watcher を閉じて、もう一度再起動します。

Windows IoT Core ウォッチャー

2.) ローカル PC で管理者 PowerShell コンソールを起動します。これを行う最も簡単な方法は、Windows の [スタート] メニューの近くにある [Web と Windows を検索] テキスト ボックスに「powershell」と入力することです。Windows は、マシン上の PowerShell を検出します。Windows PowerShell エントリを右クリックし、[管理者として実行] を選択します。PS コンソールが表示されます。

管理者として Powershell を実行する

3.) リモート接続を有効にするために、デスクトップで WinRM サービスを開始する必要がある場合があります。PS コンソールから次のコマンドを入力します。

 net start WinRM 

4.) PS コンソールから、次のコマンドを入力します。'' は、前にコピーした 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 で、次のコマンドを入力します。

setcomputername

2.後でラボで Azure に発行するために使用されるセキュリティ トークンが有効になるには、Pi の日付と時刻が正確である必要があります。Pi の現在のタイム ゾーン設定を確認するには、次のように入力します。

tzutil /g

3. 報告されたタイム ゾーンが正しくない場合は、以下を使用して有効なタイム ゾーンのリストを見つけることができます (PowerShell ウィンドウのバッファ サイズを増やす必要がある場合があります)。

tzutil /l

4.タイムゾーンを設定するには、上記の手順で必要なタイムゾーンの ID を見つけて、次を使用します。

tzutil /s "あなたのタイムゾーン名"

たとえば、「太平洋標準時」の場合

tzutil /s "太平洋標準時"

5. Raspberry Pi で日付を確認するには、次のように入力します。

取得日

6.日付または時刻が正しくない場合は、Set-Date ユーティリティを使用します。

Set-Date "mm/dd/yy hh:mm:ss AM/PM"

たとえば、2016 年 1 月 3 日の午後 12 時 15 分だった場合:

Set-Date "01/03/16 12:15 PM"

7.デバイスを再起動して、変更を有効にします。shutdown コマンドは次のように使用できます。

シャットダウン /r /t 0

于 2016-03-11T16:13:40.430 に答える