Klok in tray aanzetten

Dit is een instelling die in het DWORD Settings HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2 word opgeslagen op de 9de positie. Op het moment dat je de klok aan/uit zet, word deze wijziging pas bij het uitloggen in de Settings key weggeschreven.

Deciphering STUCKRECTS2 komt met:

So if you look at a StuckRects2 \ Settings value, you’ll see it’s a registry value 
which looks like this 28 00 00 00 ff ff ff ff 06 00 00 00 03 00 00 00 44 00 and so forth…  
Each of these numbers are actually binary, so for example 00 = 00000000 whereas FF = 11111111 and everything in between.  
Finally to top it all off, the bits in each binary number control different elements of different parts of the shell.
 
So let me explain.  I found that the 9th binary number is actually what controls the Windows taskbar, 
but that’s not enough – I needed to understand what each bit did, so I changed the bits one by one 
until I had them all documented – here is what I found, I’ll write them top down representing left to right…
 
1 – Toggles the Previews (Vista only – doesn’t seem to do anything in XP)
1 – Toggles the Display Power option
1 – Toggles the Display Network option
1 – Toggles the Display Volume option
1 – Toggles the Display Clock option
1 – Toggles the Use Small Icons option
1 – Toggles the Keep Taskbar On Top option
1 – Toggles the Auto Hide Taskbar option
 
So if you said you wanted to toggle the Display Power and Display Clock options only, 
you would use 01001000 which you would then convert into hexadecimal (72) which would then become your 9th binary number…

En het volgende VBscript (dat niet lijkt te werken):

const HKCU = &H80000001
 
dim oWMIReg
set oWMIReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") 
 
dim iValueArray()
 
oWMIReg.GetBinaryValue HKCU, "Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2", "Settings", iValueArray
 
iValueArray(8) = (iValueArray(8) AND &h07) OR &h08
 
oWMIReg.SetBinaryValue HKCU, "Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2", "Settings", iValueArray

Onderstaand script van J House Consulting - Enable Clock on Task Bar for Windows XP and 2003 zou de aanpassing voor je moeten doen, maar lijkt ook niet te werken.

'================================================================================
'
' Release 1.2
' Modified by Jeremy@jhouseconsulting.com 23rd April 2009.
'
' Original Script written by jeffdurbin at gmail dot com on 24th January 2003.
'
' COMMENT:   In a Terminal/Citrix Server environment, the administrator usually
'          tightly controls the user environment using System or Group Policies.
'          Policy settings make changes to registry values that are reflected in
'          the user's environment. Unfortunately, some of the common settings,
'          such as those that affect the Taskbar, are not controllable via policy.
'          Examining the registry value that determines the Taskbar's configuration
'          reveals the problem: The settings are lumped into a binary key. In the
'          case of the Taskbar, 4 bits of byte 9 (for Win2K and above) determine
'          which of the Taskbar's options are enabled. This is a problem, as System
'          and Group Policies do not give us a mechanism for changing a single bit
'          within a byte. Take the clock, for example. I routinely have customers
'          that ask me to either turn the clock ON for all users, or turn the clock 
'          OFF for all users. This is not a problem for users that have never 
'          logged on and don't have a Terminal Server profile. I modify the
'          Default User profile on the Citrix servers using REGEDT32 and set 
'          the options the way I want them. I'm out of luck for users with roaming
'          profiles that already exist, however; because their profiles already 
'          exist, they never receive the settings I've made in the Default User
'          profile. So the question becomes: how do you change the settings for
'          users with existing profiles?
'            One way would be to use REGEDT32 to load the NTUSER.DAT registry 
'          hive for each user and make the change. That's fine if you have 10
'          users, but if you've got 500, that's not practical. Obviously, you
'          want to make a change as the user logs in. The first question to 
'          resolve is, what bits need to be changed? The bits and their functions
'          are as follows:
'          
'                 Bit 1 (from right): on = auto hide
'                 Bit 2 (from right): on = always on top
'                 Bit 3 (from right): on = show small icons in start menu
'                 Bit 4 (from right): on = hide clock
'           
'                                    Auto   Always  Show Small  Hide
'                   Binary  Dec Hex  Hide   On Top    Icons     Clock
'                 ----------------------------------------------------
'                 | 00000000 00 00 |      |        |           |     |
'                 | 00000001 01 01 |  x   |        |           |     |
'                 | 00000010 02 02 |      |   x    |           |     |
'                 | 00000011 03 03 |  x   |   x    |           |     |
'                 | 00000100 04 04 |      |        |    x      |     |
'                 | 00000101 05 05 |  x   |        |    x      |     |
'                 | 00000110 06 06 |      |   x    |    x      |     |
'                 | 00000111 07 07 |  x   |   x    |    x      |     |
'                 | 00001000 08 08 |      |        |           |  x  |
'                 | 00001001 09 09 |  x   |        |           |  x  |
'                 | 00001010 10 0A |      |   x    |           |  x  |
'                 | 00001011 11 0B |  x   |   x    |           |  x  |
'                 | 00001100 12 0C |      |        |    x      |  x  |
'                 | 00001101 13 0D |  x   |        |    x      |  x  |
'                 | 00001110 14 0E |      |   x    |    x      |  x  |
'                 | 00001111 15 0F |  x   |   x    |    x      |  x  |
'                 | --------------------------------------------------
' 
'                 SINGLE OPTIONS:
'                 08 = No Settings Enabled
'                 09 = Auto Hide
'                 00 = Show Clock
'                 0A = Always on Top
'                 0C = Show small icons in Start Menu
'                 
'                 MULTIPLE OPTIONS:
'                 01 = Auto Hide and Show Clock
'                 02 = Always on Top and Show Clock
'                 03 = Always on Top and Auto Hide and Show Clock
'                 04 = Show small icons in Start Menu and Show Clock
'                 0E = Always on Top and Show small icons in Start Menu
'                 0F = Always on Top and Auto Hide and Show small icons in Start Menu
'                 06 = Always on Top and Show small icons in Start Menu and Show Clock
'                 07 = All Options Enabled
'                 0B = Always on Top and Auto Hide
'                 0D = Auto Hide and Show small icons in Start Menu
'                 
'            Writing a script to change those bits is simple. Unfortunately,
'          if you run the script during logon, the changes aren't reflected 
'          on the Taskbar because Explorer has already loaded. You might think
'          that the changes would show up at the next login, but that's not 
'          the case; it seems that that the settings revert to those stored
'          in the profile. You could kill Explorer and restart it, but that
'          wouldn't be a very nice login for the users.
'            The answer is to run the script -before- Explorer starts. To do
'          this, follow these instructions*:
'          
'          1. Save this script to your Winnt\system32 folder
'          2. Open winnt\system32\usrlogon.cmd
'          3. Add the following line after the @Echo off line:
'          
'             %systemroot%\system32\SetTaskBarOptions.vbs
'          
'            That's it. Now, when a user logs in, the script will run and set 
'          the options before Explorer runs, so the settings will show up
'          immediately.
'
'          * These instructions are for Terminal Servers. A similar technique
'            can be used on non-TS machines (which don't use USRLOGON.CMD). 
'            At HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon,
'            there is a value called 'UserInit' which references an executable
'            called USERINIT.EXE. You can replace the reference to USERINIT.EXE
'            with a reference to a batch file (say, USERINIT.CMD). The batch
'            file contents could be:
' 
'            @echo off
'            cls
'            SetTaskBarOptions.vbs
'            userinit
'          
'   USAGE: This script relies on WMI, which is included with Win2K and above. 
'
'          To configure the options, modify the variables below the line that 
'          reads: '*************** OPTIONS ARE SET HERE ***************
'          For example, I prefer the following configuration: show clock, always
'          on top, do not hide taskbar, show small icons. To achieve this result,
'          I need to set 1 bit (always on top), and clear 3 bits (auto hide
'          taskbar, hide clock, show small icons). You simply add the 4 constants
'          to the appropriate variable: intBitsToSet or intBitsToClear.
'            The registry key is called StuckRects2 in Windows 2000 and above.
'
' IMPORTANT: Usually the Stuckrects2 key is only created when the user logs off for
'            the first time with a new profile. Therefore these settings would only
'            take place after the second login. However, as you will see, this
'            script will create a default key and value, and populate it with a
'            typical default value to start with.
'
' This is typically what the default value is after the first logoff...
' Settings = hex:28,00,00,00,ff,ff,ff,ff,0a,00,00,00,03,00,00,00,3c,00,00,00,1e,00,00,00,fe,ff,ff,ff,e4,03,00,00,02,05,00,00,02,04,00,00
 
' This is what we change it to. Notice the 9th hex value.
' Settings = hex:28,00,00,00,ff,ff,ff,ff,02,00,00,00,03,00,00,00,3c,00,00,00,1e,00,00,00,fe,ff,ff,ff,e4,03,00,00,02,05,00,00,02,04,00,00
'
' This "simple" change enables the clock on the task bar.
'
'================================================================================
 
Option Explicit
 
Dim objReg, intBitsToClear, intBitsToSet, strComputer, strKeyPath, strKeyRoot
Dim strValue, strValueData, arrTemp, item, arrValueData, Return, i, blnDebug
Dim intDecimalValue, StdOut
 
Const HKEY_CURRENT_USER = &H80000001
Const cAutoHideTaskbar = 1
Const cAlwaysOnTop = 2
Const cShowSmallIcons = 4
Const cHideClock = 8
 
'*************** OPTIONS ARE SET HERE ***************
 
intBitsToSet = cAlwaysOnTop
intBitsToClear = cAutoHideTaskbar & cHideClock & cShowSmallIcons
' These options will set the 9th value to 02 (00000010), which is
' Always on Top and Show Clock
 
'****************************************************
 
Set StdOut = WScript.StdOut
strComputer = "."
strKeyRoot = "HKCU\"
strKeyPath ="SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Stuckrects2"
strValue = "Settings"
strValueData = "28,00,00,00,ff,ff,ff,ff,0a,00,00,00,03,00,00,00,3c,00,00,00,1e,00,00,00,fe,ff,ff,ff,e4,03,00,00,02,05,00,00,02,04,00,00"
blnDebug = False
 
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\" & _
    strComputer & "\root\default:StdRegProv")
 
' New profiles will not contain the key and value, so we need to create them, using
' typical default data to start with.
If NOT RegKeyExists(strKeyRoot & strKeyPath) Then
  Return = objReg.CreateKey (HKEY_CURRENT_USER,strKeyPath)
  If blnDebug Then
    If (Return = 0) And (Err.Number = 0) Then
      Wscript.Echo "Create the " & strKeyPath & " key."
    Else
      Wscript.Echo "Could not create the " & strKeyPath & " key."
    End If
  End If
End If
If NOT RegValueExists(strKeyRoot & strKeyPath & "\" & strValue) Then
' This is tricky to add because we need to present the data to the SetBinaryValue method
' as an array of strings, each representing an integer between 0 and 255. So we first
' need to convert the string of hex values into an array of integers. 
  arrTemp = Split(strValueData,",")
  For i = 0 to ubound(arrTemp)
    intDecimalValue = HexToDec(arrTemp(i))
    If blnDebug Then
      wscript.echo "Array Element " & i & ": " & intDecimalValue
    End If
    If IsArray (arrValueData) Then
      ReDim Preserve arrValueData(uBound(arrValueData) + 1)
    Else
      ReDim arrValueData(i)
    End If
    arrValueData(i) = intDecimalValue
  Next
  If blnDebug Then
    For i = 0 to uBound(arrValueData) - 1
      StdOut.WriteLine "Array Element " & i & ": " & arrValueData(i)
    Next
  End If
  Return = objReg.SetBinaryValue (HKEY_CURRENT_USER, strKeyPath, strValue, arrValueData)
  If blnDebug Then
    If (Return = 0) And (Err.Number = 0) Then
      Wscript.Echo "SetBinaryValue succeeded."
    Else
      Wscript.Echo "SetBinaryValue failed. Error = " & Err.Number
    End If
  End If
End If
 
' Read in the Binary value and set the required options.
Return = objReg.GetBinaryValue (HKEY_CURRENT_USER, strKeyPath, strValue, arrValueData)
If blnDebug Then
For i = 0 to uBound(arrValueData)
   StdOut.WriteLine "Array Element " & i & ": " & arrValueData(i)
Next
End If
 
If (Return = 0) And (Err.Number = 0) Then
 
  If ubound(arrValueData) > 0 Then
    arrValueData(8) = arrValueData(8) OR intBitsToSet
    arrValueData(8) = arrValueData(8) AND (NOT(intBitsToClear))
 
    Return = objReg.SetBinaryValue (HKEY_CURRENT_USER, strKeyPath, strValue, arrValueData)
    If blnDebug Then
      If (Return = 0) And (Err.Number = 0) Then
        Wscript.Echo "SetBinaryValue succeeded"
      Else
        Wscript.Echo "SetBinaryValue failed. Error = " & Err.Number
      End If
    End If
 
' Set: Byte = Byte OR cShowSmallIcons
' Clear: Byte = Byte AND (NOT(cShowSmallIcons)) 
' Check: if ((Byte AND cShowSmallIcons) = cShowSmallIcons)
 
  End If
End If
 
Set objReg = Nothing
Set StdOut = Nothing
 
WScript.Quit(0)
 
Function RegKeyExists(ByVal sRegKey)
' Returns True or False based on the existence of a registry key.
  Dim sDescription, oShell
  Set oShell = CreateObject("WScript.Shell")
  RegKeyExists = True
  sRegKey = Trim (sRegKey)
  If Not Right(sRegKey, 1) = "\" Then
    sRegKey = sRegKey & "\"
  End If
  On Error Resume Next
  oShell.RegRead "HKEYNotAKey\"
  sDescription = Replace(Err.Description, "HKEYNotAKey\", "")
  Err.Clear
  oShell.RegRead sRegKey
  RegKeyExists = sDescription <> Replace(Err.Description, sRegKey, "")
  On Error Goto 0
  Set oShell = Nothing
End Function
 
Function RegValueExists(sRegValue)
' Returns True or False based of the existence of a registry value.
  Dim oShell, RegReadReturn 
  Set oShell = CreateObject("WScript.Shell") 
  RegValueExists = True  ' init value 
  On Error Resume Next 
  RegReadReturn = oShell.RegRead(sRegValue) 
  If Err.Number <> 0 Then 
    RegValueExists = False 
  End if 
  On Error Goto 0 
  Set oShell = Nothing
End Function
 
Function HexToDec(strHex)
' This function converts a hexadecimal value represented by a string into a decimal value.
' http://www.sonofsofaman.com/hobbies/code/hextodec.asp
  dim lngResult
  dim intIndex
  dim strDigit
  dim intDigit
  dim intDecimalValue
  lngResult = 0
  for intIndex = len(strHex) to 1 step -1
    strDigit = mid(strHex, intIndex, 1)
    intDigit = instr("0123456789ABCDEF", ucase(strDigit))-1
    if intDigit >= 0 then
      intDecimalValue = intDigit * (16 ^ (len(strHex)-intIndex))
      lngResult = lngResult + intDecimalValue
    else
      lngResult = 0
      intIndex = 0 ' stop the loop
    end if
  next
  HexToDec = lngResult
End Function