vRD 2008 – A short review

I have been using vRD 1.5 for a while and did just purchase a license for vRD 2008.

I love the program…

When you are in need of multiple credentials for RDP-sessions (different customers, domains or whatver) vRD rocks!

Since I work as a consultant I set up one credential for each customer and then one folder (Linking to the right credential) for each customer.
And in that folder I can create servers, subfolders and so on.

In short: If you have multiple servers and/or multiple credentials, download it and try it out!

From Visonapp,com about vRD:

vRD 2008 features unparalleled ease of use, accelerated remote desktop access to servers and workstations, detailed logging features, and a new interface that allows administrators to view all connected machines simultaneously.
Considerably simplifying the administration of their systems, more than 75,000 administrators worldwide consider vRD an indispensable tool for recurring administrative tasks.

More info and download: visionapp.com

Visionapp Remote Desktop 2008

A few notes to the developers for the next version:

  • General
    • When using Alt+Tab, the vRD-window is selected instead of the tab with the machine and by that you can’t use ALT+TAB and start using the keyboard on the remote host.
    • Shortcut-key to each tab (Say ALT+F1 for tab 1)
  • Options
    • Thumbnail size – I want a larger (aprox 2 x Large)
  • Properties for a connection
    • I want a shortcut-key, faster way to connect
  • Management Board URL
    • Open in a tab instead of browser
    • I want to se some sort of standard-url, like http://%servername%:%port_that_you_can_configure%/myservices.html
  • Small stuff
    • From about-box, when clicking the URLs you start MSIE instead of standard browser… just annoying

SCCM Console Extensions

Some small notes and short (but powerful) example about SCCM Console Extensions…

Some good-to-have GUIDs
You find them all in adminconsole.xml

  • fa922e1a-6add-477f-b70e-9a164f3b11a2 – First-level collections
  • dbb315c3-1d8b-4e6a-a7b1-db8246890f59 – Subcollections
  • 7ba8bf44-2344-4035-bdb4-16630291dcf6 – Resource in collection
  • de41d5d8-3845-4e67-9657-0121f06f5e27 – Programs
  • a1ad0705-ce2d-4981-96f5-8f0faad47396 – Advertisments
  • 49696c48-9c3a-4d4a-bb38-473394700d43 – Site Systems

Some of the SUBs
You find them all in adminconsole.xml

  • ##SUB:__Server##
  • ##SUB:__Namespace##
  • ##SUB:Name##
  • ##SUB:PackageID##
  • ##SUB:ProgramName##
  • ##SUB:SiteCode##
  • ##SUB:SiteName##
  • ##SUB:NetworkOSPath##
  • ##SUB:AddressType##
  • ##SUB:Order##
  • ##SUB:value##
  • ##SUB:ItemName##

Example XML-file:
(Put it to “SCCM\AdminUI\XmlStorage\Extensions\Actions\fa922e1a-6add-477f-b70e-9a164f3b11a2\sccmExtensions.xml”)

1
2
3
4
5
6
<actiondescription class="Executable" displayname="Show Params" mnemonicdisplayname="Show Params" description="Show Params">
        <executable>
                <filepath>C:\sccmExtenstions.vbs</filepath>
                <parameters>##SUB:__Server## ##SUB:__Namespace## ##SUB:Name## ##SUB:PackageID## ##SUB:ProgramName## ##SUB:SiteCode## ##SUB:SiteName## ##SUB:NetworkOSPath## ##SUB:AddressType## ##SUB:Order## ##SUB:value## ##SUB:ItemName##</parameters>
        </executable>
</actiondescription>

And the script to use
(Put this into C:\sccmExtensions.vbs)

1
2
3
4
5
sOut = ""
For i = 0 to WScript.Arguments.Count-1
        sOut = sOut & "Arg " & i+1 & " : " & Wscript.Arguments(i) & vbCrLf
Next
MsgBox sOut

Then, try to right-click a first level collection and select “Show Params”…

Tip
Greg Ramsy’s Console Extensions GUID Locator
;-)

Happy scripting! :-)


PXE Filter (v4.1.501)

Got a comment on another post from Thomas who was asking for a version of the PXE Filter that works.

I have used this one on a few installations.

You need to configure:
sProviderServer if you have the PXE point on another server
sSiteCode for your site
sCollection to the collection which you advertise your deployment task sequence

What the PXEFilter does is (in general):

  • Check if the machine exist, and if not adds it to the SCCM.
  • Checks if the machine is member of a specific collection (sCollection) and if not adds it to the collection (Direct member)
  • Waits until the machine can see the advertisment (A maximum of 30 seconds)

PXEFilter.vbs v4.1.501 (Download VBS)

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
' //***************************************************************************
' // ***** Script Header *****
' //
' // Solution:  Microsoft Deployment Toolkit
' // File:      PXEFilter.vbs
' //
' // Purpose:   Decide what needs to be done for each PXE requests received
' //            by WDS.  If not present in the ConfigMgr database, add it.
' //
' // Usage:     (loaded automatically by Microsoft.BDD.PXEFilter DLL)
' //
' // Microsoft Solution Version:  4.1.501
' // Microsoft Script Version:    4.1.501
' // Customer Build Version:      1.0.0
' // Customer Script Version:     1.0.0
' //
' // Microsoft History:
' // 4.0.501 MTN  02/19/2008  Added header, additional logging, advertisement
' //                          verification for every request.
' //
' // Customer History:
' //
' // ***** End Header *****
' //***************************************************************************
 
'//----------------------------------------------------------------------------
'//
'//  Set global variables, used by the ZTIProcess function below.  (Note that
'//  any changes to this script will require restarting the WDS service, since
'//  the script is only loaded once and kept in memory as long as the service
'//  is running.)
'//
'//  If ConfigMgr is running on the same server as WDS, the sProviderServer
'//  value can be left blank and the sUsername and sPassword values must be
'//  blank.
'//----------------------------------------------------------------------------
 
Option Explicit
 
Dim sProviderServer
Dim sSiteCode
Dim sNamespace
Dim sUsername
Dim sPassword
Dim sCollection
 
sProviderServer = ""
sSiteCode = "ABC"
sNamespace = "root\sms\site_" & sSiteCode
sUsername = ""
sPassword = ""
sCollection = "ABC00004"   ' This must be a collection ID, not a collection name
 
'//----------------------------------------------------------------------------
'//  Main routine
'//----------------------------------------------------------------------------
 
ZTIProcess
 
Function ZTIProcess
 
        Dim sMacAddress
        Dim sIPAddress
        Dim sUUID
        Dim sNetBiosName
        Dim oLocator
        Dim oSMS
        Dim sQuery
        Dim bFound
        Dim iResourceID
        Dim re
        Dim oSite
        Dim oParams
        Dim oResult
        Dim oLastError
        Dim oClients
        Dim oClient
        Dim oCollection
        Dim oNewRule
        Dim oAdvertisement
        Dim bTrying
        Dim sAdvert
        Dim i
 
        ' Initialization
 
        sMacAddress = PXE.MacAddress
        sIPAddress = PXE.IPAddress
        sUUID = PXE.UUID
 
        Set re = New RegExp
        re.Pattern = ":"
        re.Global = true
        sNetBiosName = "MAC" & re.Replace(sMacAddress, "")
 
        ' Clear invalid UUID values
 
        If sUUID = "00000000-0000-0000-0000-000000000000" or sUUID = "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF" then
                sUUID = ""
        End if
 
        ' Log details
 
        PXE.LogTrace "Processing request from MAC address = " & sMacAddress & ", IP address = " & sIPAddress & ", UUID = " & sUUID
 
        '//----------------------------------------------------------------------------
        '//  Filter requests.  This may need to be customized if you only want some
        '//  network segments to be supported.
        '//----------------------------------------------------------------------------
 
        ' Ignore ConfigMgr "ping" requests
 
        If PXE.IPAddress = "127.0.0.1" or PXE.MacAddress = "FF:FF:FF:FF:FF:FF" then
                PXE.LogTrace "Ignoring ConfigMgr ping request"
                Exit Function
        End if
 
        '//----------------------------------------------------------------------------
        '//  Verify the computer is known to ConfigMgr
        '//----------------------------------------------------------------------------
 
        ' Connect to the SMS provider
 
        Set oLocator = CreateObject("WbemScripting.SWbemLocator")
        Set oSMS = oLocator.ConnectServer(sProviderServer, sNamespace, sUsername, sPassword)
 
        ' Build the query
 
        sQuery = "SELECT * FROM SMS_R_System WHERE MacAddresses = '" & sMacAddress & "'"
        If sUUID <> "" then
                sQuery = sQuery & " OR SMBIOSGUID = '" & sUUID & "'"
        End if
 
        ' Process the query
 
        bFound = False
        Set oClients = oSMS.ExecQuery(sQuery)
        For each oClient in oClients
                bFound = true
                iResourceID = oClient.ResourceID
                PXE.LogTrace "Found existing machine " & oClient.NetbiosName & " with ResourceID = " & iResourceID
                sNetBiosName = oClient.NetbiosName
                Exit For
        Next
 
        '//----------------------------------------------------------------------------
        '//  If necessary, add the computer to the ConfigMgr database
        '//----------------------------------------------------------------------------
 
        If not bFound then
 
                PXE.LogTrace "Could not find machine with MAC address '" & sMacAddress & "' or SMBIOS UUID '" & sUUID & "'."
 
                ' Add the computer
 
                Set oSite = oSMS.Get("SMS_Site")
                Set oParams = oSite.Methods_.Item("ImportMachineEntry").inParameters.SpawnInstance_()
                oParams.NetbiosName = sNetBiosName
                oParams.SMBIOSGUID = sUUID
                oParams.MACAddress = sMacAddress
                oParams.OverwriteExistingRecord = false
 
                On Error Resume Next
                Set oResult = oSite.ExecMethod_("ImportMachineEntry", oParams)
                If Err then
                        PXE.LogTrace "Error importing machine entry: " & Err.Description & " (" & Err.Number & ")"
                        Set oLastError = CreateObject("WbemScripting.SWbemLastError")
                        PXE.LogTrace "Last WMI error: " & oLastError.Description
                        Exit Function
                End if
                On Error Goto 0
 
                iResourceID = oResult.ResourceID
                PXE.LogTrace "Added new machine with ResourceID = " & iResourceID
 
        End if
 
        '//----------------------------------------------------------------------------
        '//  Check if the computer is a member of the specified collection
        '//----------------------------------------------------------------------------
 
        If bFound then
 
                ' Build the query
 
                sQuery = "SELECT * FROM SMS_CM_RES_COLL_" & sCollection & " WHERE ResourceID = " & iResourceId
 
                ' Process the query
 
                bFound = False
                Set oClients = oSMS.ExecQuery(sQuery)
                For each oClient in oClients
                        bFound = true
                        PXE.LogTrace "Machine is already in collection " & sCollection
                        Exit For
                Next
 
        End If
 
        '//----------------------------------------------------------------------------
        '//  If necessary, add the computer to the specified collection
        '//----------------------------------------------------------------------------
 
        If not bFound then
 
                ' Add the computer to the specified collection
 
                On Error Resume Next
                Set oCollection = oSMS.Get("SMS_Collection.CollectionID='" & sCollection & "'")
                If Err then
                        PXE.LogTrace "Error retrieving collection " & sCollection & ": " & Err.Description & " (" & Err.Number & ")"
                        Set oLastError = CreateObject("WbemScripting.SWbemLastError")
                        PXE.LogTrace "Last WMI error: " & oLastError.Description
                        Exit Function
                End if
                On Error Goto 0
 
                Set oNewRule = oSMS.Get("SMS_CollectionRuleDirect").SpawnInstance_()
                oNewRule.ResourceClassName = "SMS_R_System"
                oNewRule.RuleName = sNetBiosName
                oNewRule.ResourceID = iResourceID
 
                On Error Resume Next
                oCollection.AddMembershipRule oNewRule
                If Err then
                        PXE.LogTrace "Error adding membership rule to " & sCollection & ": " & Err.Description & " (" & Err.Number & ")"
                        Set oLastError = CreateObject("WbemScripting.SWbemLastError")
                        PXE.LogTrace "Last WMI error: " & oLastError.Description
                        Exit Function
                End if
                On Error Goto 0
                PXE.LogTrace "Added new membership rule to collection " & sCollection
 
        End if
 
        '//----------------------------------------------------------------------------
        '//  Wait until an advertisement is seen.
        '//----------------------------------------------------------------------------
 
        ' Check for the advertisements
 
        Set oAdvertisement = oSMS.Get("SMS_Advertisement")
        i = 0
        bTrying = True
        Do While bTrying
 
                Set oParams = oAdvertisement.Methods_("GetAdvertisements").inParameters.SpawnInstance_()
                oParams.ResourceID = iResourceID
 
                Set oResult = oAdvertisement.ExecMethod_("GetAdvertisements", oParams)
                For each sAdvert in oResult.AdvertisementIDs
                        PXE.LogTrace "Found advertisement " & sAdvert
                        bTrying = False
                Next
 
                i = i + 1
                If bTrying and i > 10 then
                        PXE.LogTrace "Giving up after 30 seconds of checking for new advertisements."
                        bTrying = False
                End if
 
                PXE.Sleep 3000
 
        Loop
 
        PXE.LogTrace "Exiting PXEFilter.vbs"
 
End Function