Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. same enumeration, different results?

same enumeration, different results?

Scheduled Pinned Locked Moved C#
questioncsharpcomworkspace
25 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P PIEBALDconsult

    Either the StartTime gives you what you want directly or not at all, no amount of manipulation is going to give you what it doesn't have so stop trying that. Now, what is it you are trying to accomplish? Do you want to know when the system started up? I recommend creating a Windows Scheduled Task to run at system startup and log that somewhere; it could be as simple as echo %date% %time% >> %appdata%\Reboot.log .

    C Offline
    C Offline
    CCodeNewbie
    wrote on last edited by
    #16

    Still not perfect - but it works (Improvements very welcome)

    TimeSpan uptime = TimeSpan.Zero;
    using (PerformanceCounter ut = new PerformanceCounter("System", "System Up Time"))
    {
    ut.NextValue();
    uptime = TimeSpan.FromSeconds(ut.NextValue());
    }
    Console.WriteLine(uptime.ToString());
    //result - 03:53:39.7870000

    Process[] processlist = Process.GetProcesses();
    foreach (Process procs in processlist)
    {
    if (procs.ProcessName == "System")
    {
    long st = procs.StartTime.ToFileTime();
    DateTime stDt = new DateTime(1601, 1, 1).AddSeconds(st);
    float Days = (Environment.TickCount / 86400000);
    int dd = (int)Days;
    float Hours = (Environment.TickCount / 3600000 % 24);
    int HH = (int)Hours;
    float Mins = (Environment.TickCount / 60000 % 60);
    int mm = (int)Mins;
    float Secs = (Environment.TickCount / 1000 % 60);
    int ss = (int)Secs;
    DateTime result = DateTime.Now - new TimeSpan(dd, HH, mm, ss);
    }
    }
    //result - 20/03/2012 08:31:33

    code run @ ~ 12:24 pm

    A 1 Reply Last reply
    0
    • L Luc Pattyn

      24.85

      Luc Pattyn [My Articles] Nil Volentibus Arduum

      C Offline
      C Offline
      CCodeNewbie
      wrote on last edited by
      #17

      Hi Luc, Got it working but wanted to say thank you for your help (code is in my reply to PIEBALDconsult). Would welcome your thoughts and comments...

      1 Reply Last reply
      0
      • C CCodeNewbie

        I already know what time the computer/system started up. I want to know what time the "System" process, as viewed in the Task Manager started.

        P Offline
        P Offline
        PIEBALDconsult
        wrote on last edited by
        #18

        For what purpose? Task Manager says mine started in 2009 which is certainly untrue. So I don't see how you can do better. P.S. Even as the administrator on my home system (Win 7) I still get the access violation when I try to get the StartTime of the System process.

        C 1 Reply Last reply
        0
        • C CCodeNewbie

          Still not perfect - but it works (Improvements very welcome)

          TimeSpan uptime = TimeSpan.Zero;
          using (PerformanceCounter ut = new PerformanceCounter("System", "System Up Time"))
          {
          ut.NextValue();
          uptime = TimeSpan.FromSeconds(ut.NextValue());
          }
          Console.WriteLine(uptime.ToString());
          //result - 03:53:39.7870000

          Process[] processlist = Process.GetProcesses();
          foreach (Process procs in processlist)
          {
          if (procs.ProcessName == "System")
          {
          long st = procs.StartTime.ToFileTime();
          DateTime stDt = new DateTime(1601, 1, 1).AddSeconds(st);
          float Days = (Environment.TickCount / 86400000);
          int dd = (int)Days;
          float Hours = (Environment.TickCount / 3600000 % 24);
          int HH = (int)Hours;
          float Mins = (Environment.TickCount / 60000 % 60);
          int mm = (int)Mins;
          float Secs = (Environment.TickCount / 1000 % 60);
          int ss = (int)Secs;
          DateTime result = DateTime.Now - new TimeSpan(dd, HH, mm, ss);
          }
          }
          //result - 20/03/2012 08:31:33

          code run @ ~ 12:24 pm

          A Offline
          A Offline
          Alan N
          wrote on last edited by
          #19

          I'm glad you've come to a solution that you are happy with. One point that I'm not sure you appreciate is that the up time obtained from the performance counter and the TickCount are essentially the same value.

          private void CompareCounterAndTickCount() {
            using (PerformanceCounter ut = new PerformanceCounter("System", "System Up Time")) {
              ut.NextValue();
              TimeSpan counterUpTime = TimeSpan.FromSeconds(ut.NextValue());
              TimeSpan tickCountUpTime = TimeSpan.FromMilliseconds(Environment.TickCount);
              Console.WriteLine("Up Time");
              Console.WriteLine("  from performance counter {0}", counterUpTime);
              Console.WriteLine("  from tickcount           {0}", tickCountUpTime);
            }
          }
          

          On my system the duration reported by TickCount is ~0.2s longer than the performance counter's value which presumably just means the two counters do not share the same origin. Also note the use of the FromMilliseconds method to convert the TickCount to a TimeSpan, much simpler than your multistep calculation! Alan.

          C 1 Reply Last reply
          0
          • P PIEBALDconsult

            For what purpose? Task Manager says mine started in 2009 which is certainly untrue. So I don't see how you can do better. P.S. Even as the administrator on my home system (Win 7) I still get the access violation when I try to get the StartTime of the System process.

            C Offline
            C Offline
            CCodeNewbie
            wrote on last edited by
            #20

            You need to run it as System (mine impersonates System to get the info, Administrator doesn't have enough privileges) The purpose is a) because it completes the Process listing and allows me to cross-reference against netstat & system boot-time.

            P 1 Reply Last reply
            0
            • A Alan N

              I'm glad you've come to a solution that you are happy with. One point that I'm not sure you appreciate is that the up time obtained from the performance counter and the TickCount are essentially the same value.

              private void CompareCounterAndTickCount() {
                using (PerformanceCounter ut = new PerformanceCounter("System", "System Up Time")) {
                  ut.NextValue();
                  TimeSpan counterUpTime = TimeSpan.FromSeconds(ut.NextValue());
                  TimeSpan tickCountUpTime = TimeSpan.FromMilliseconds(Environment.TickCount);
                  Console.WriteLine("Up Time");
                  Console.WriteLine("  from performance counter {0}", counterUpTime);
                  Console.WriteLine("  from tickcount           {0}", tickCountUpTime);
                }
              }
              

              On my system the duration reported by TickCount is ~0.2s longer than the performance counter's value which presumably just means the two counters do not share the same origin. Also note the use of the FromMilliseconds method to convert the TickCount to a TimeSpan, much simpler than your multistep calculation! Alan.

              C Offline
              C Offline
              CCodeNewbie
              wrote on last edited by
              #21

              Yes, but I am not trying to get the system start-time. I can already get that using Ravi's post (see my previous question). I explicitly want the System process's start-time.

              A 1 Reply Last reply
              0
              • C CCodeNewbie

                Yes, but I am not trying to get the system start-time. I can already get that using Ravi's post (see my previous question). I explicitly want the System process's start-time.

                A Offline
                A Offline
                Alan N
                wrote on last edited by
                #22

                I can't understand your reasoning in this matter. The SystemUp Time performance counter description is System Up Time is the elapsed time (in seconds) that the computer has been running since it was last started. This counter displays the difference between the start time and the current time. The Environment.TickCount description is A 32-bit signed integer containing the amount of time in milliseconds that has passed since the last time the computer was started. Subtracting either from the current time gets the time when the computer was started. I don't see why (or how) you differentiate the system start time and the "System" process start time. Alan.

                C 1 Reply Last reply
                0
                • C CCodeNewbie

                  You need to run it as System (mine impersonates System to get the info, Administrator doesn't have enough privileges) The purpose is a) because it completes the Process listing and allows me to cross-reference against netstat & system boot-time.

                  P Offline
                  P Offline
                  PIEBALDconsult
                  wrote on last edited by
                  #23

                  CCodeNewbie wrote:

                  because it completes the Process listing

                  Then just display what the StartTime property tells you and leave it at that.

                  C 1 Reply Last reply
                  0
                  • A Alan N

                    I can't understand your reasoning in this matter. The SystemUp Time performance counter description is System Up Time is the elapsed time (in seconds) that the computer has been running since it was last started. This counter displays the difference between the start time and the current time. The Environment.TickCount description is A 32-bit signed integer containing the amount of time in milliseconds that has passed since the last time the computer was started. Subtracting either from the current time gets the time when the computer was started. I don't see why (or how) you differentiate the system start time and the "System" process start time. Alan.

                    C Offline
                    C Offline
                    CCodeNewbie
                    wrote on last edited by
                    #24

                    Hi Alan, The reason(s) for wanting the System process start-time never had anything to do with getting the PCs boot-time. It had to do with being able to complete a running-processes table, x-reference against 2 other sql tables that form part of the project and possibly because I saw so many forum postings that said it can't be done :) Thanks for all your help with this & when I have completed phase 2 and/or 3 I will probably post the whole thing as an article and look forward to your comments.

                    1 Reply Last reply
                    0
                    • P PIEBALDconsult

                      CCodeNewbie wrote:

                      because it completes the Process listing

                      Then just display what the StartTime property tells you and leave it at that.

                      C Offline
                      C Offline
                      CCodeNewbie
                      wrote on last edited by
                      #25

                      The StartTime property, once manipulated to reveal a value, tells you 1601/1/1 00:00:00. That wasn't good enough for me. I wanted the actual StartTime but didn't have the syntactical knowledge of how to get it even if I did have rough idea of how it could be retrieved. Thanks to you, Alan, Ravi & Luc, I (and anybody else Googling "get Window's System process starttime" or something similar), instead of hitting dozens of sites saying it can't be done, now have a solution. I would like to think that's what boards like this are for. Thank you once again for your input.

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups