I have been looking at getting a script together for a while to mass change some shortcuts we have on our file server to point to a different location. After some research, and some playing around I found a really easy way to do this in Powershell:


# Call wscript com object
$shell = new-object -com wscript.shell

# Recurse through directories for .lnk files
dir "I:\" -filter *.lnk -recurse | foreach {
$lnk = $shell.createShortcut($_.fullname)
$oldPath= $lnk.targetPath

# If match text, perform operation
if($oldpath -match "\\serverold\share1")
{
write-host "Match: " + $_.fullname
remove-item $_.fullname
$lnknew = $shell.createShortcut($_.fullname)
$lnknew.targetPath = "`"\\newserver\share1`""
$lnknew.IconLocation = "%SystemRoot%\system32\SHELL32.dll,4"
$lnknew.Save()
}
}
Write-Host "End..."

Problems with deleting files

January 22nd, 2010 by Geoff Kendal No Comments

I came accross some directories today on our NAS that couldn’t be deleted – I really needed to get rid of them as they were causing backups to fail! Every time I tried to delete, I got the following windows error:

“cannot delete file: cannot read from source or disk”

The solution to this, was to fire up a command prompt, and locate the directory in question (Map a network drive if it’s a UNC path!), then run:

dir /x /a

This should give you the directory name, along with its shortname (e.g. AEU8P3~P). You can then either delete the folder (rd /?) or rename it (ren /?) by using the shortname!

Setting up a free Windows SVN Server

October 23rd, 2009 by Rob Milner No Comments

If you want to setup a Windows SVN server, it’s easy as pie!  I set one up for the company I work for as the Linux SVN Server was getting too difficult to manage.  I would highly recommend using the free version of VisualSVN server for Windows for your code repository: VisualSVN Server.

It’s a ~4MB msi installer, and it’s a doddle to add new repositories and manage them.  There is also an Enterprise version of the software should you need any extra features but we have found that the free one does everything we need and more.

Once you have installed the VisualSVN Server, download and install Tortoise SVN onto your computer: Tortoise Download.

You can then use Tortoise to update and commit code to your repository!

CaptureAnother of my little Windows 7 deployment annoyances has been the fact that windows media player is pinned to the new taskbar by default, and with windows 7, it’s not possible to programmatically add or remove pinned items from the taskbar.

After a while of script hunting for something that might get around this, I found out that there is an option that can be used in the unattended xml file will stop it from being automatically added!

 

 

In windows system image manager, add the following under phase 7 (OOBE):

   Windows shell setup >> Windows Features >> ShowWindowsMediaPlayer >> false

Using get and set methods with C#

October 2nd, 2009 by Rob Milner No Comments

I’ve always wondered when looking at C# what get and set methods are used for.  In basic terms I found that the get and set method was mainly for reading (get) or writing (set) a property.  After scratching my head for some time, I tried to give it a go as I have problems setting a string to a particular value within one of my C# projects.

I setup another class within my project called “tgtNotes”, which would contain my get and set:

class tgtNotesJK
{
private string LocNotes = null;
public string NotesLoc
{
get
{
return LocNotes;
}
set
{
LocNotes = value;
}
}

I then thought, “surely it’s not that easy”!  I then went back to the code on the form, and defined the class within the code for button1:

tgtNotesJK notestgt = new tgtNotesJK();

Getting and setting is really easy.  To set a value:

notesgt.NotesLoc = "Some text";

And to get the value for example:

Console.WriteLine(notesgt.NotesLoc);

Another great benefit of this is that you will be able to access the methods from anywhere within the C# project.  So because I ‘setted’ a value within button1, will mean for example that I can still access the value within other parts (for example button2).

Windows 7 point and print restrictions

September 3rd, 2009 by Geoff Kendal No Comments

I’m currently looking into deploying Windows 7 in our environment, and was having a bit of an issue with printers… When our (non-admin) users log on, our logon script detects the client location and connects the appropriate printers, I don’t want any warnings to be shown or UAC prompts, but just want the drivers to be automatically downloaded and printers added.

On vista, you could disable any prompts, by disabling the “point and print restirctions” group policy object in the user configuration, or enable it and specify certain trusted servers, unfortunatly this didn’t seem to do the trick on Windows 7 RTM. After a bit of playing, I found out that on Windows 7, you need to apply the policy to both computer and user configuration!

From time to time our Citrix users end up with multiple sessions on our Citrix farm, especially when accessing the farm via Citrix access gateway and they loose connectivity. Most of these are fixed by setting sessions in the disconnected state to be automatically reset after 15 mins. (We allow this time  incase users are moving to a meeting room for example).

The big problem for us is that you can’t run multiple instances of Lotus Notes, so the disconnected session needs to be reset before the user can fire up Lotus Notes again, otherwise they will see an error like:

“You cannot use the Administration program while the Domino Server is running. Either shut down the Domino Server (buy keep the file server running) or choose the icon labeled ‘Lotus Notes’ instead.”

In order to try and make things a bit easier on the helpdesk, I created a script that will allow users to reset their own Citrix sessions. If you want to use it you’ll need to populate the first array with a list of all the servers in your farm, then create a shortcut:

cscript /nologo citrixreset.vbs

I’ve set mine to run minimized so that they don’t see random command windows popping up.

It should also be noted, that the script resets any disconnected sessions first, so that it can still carry on and kill the active one at the end! I know it’s not the slickest of scripts (Lots of splitting arrays and capturing command output), but I couldnt find any nice objects to do it properly with!

 citrixServers = array("CXS38", "CXS39", "CXS40", "CXS41")

Set objShell = CreateObject("WScript.Shell")

Sub resetSession(s)
    count = count + 1
    sessionID = trim(mid(s,48,5))
    citrixServer = trim(mid(s,1,6))
    wscript.echo "RESET SESSION " & sessionID & " /SERVER:" & citrixServer
    Set oExec = objShell.Exec("RESET SESSION " & sessionID & " /SERVER:" & citrixServer)
End Sub

userName = objShell.ExpandEnvironmentStrings("%UserName%")

For Each citrixServer In citrixServers

    wscript.echo "QUERY SESSION " & userName & " /SERVER:" & citrixServer
    Set oExec = objShell.Exec("QUERY SESSION " & userName & " /SERVER:" & citrixServer)

    Do While oExec.Status = 0
        WScript.Sleep 100
    Loop

    Do While oExec.StdOut.AtEndOfStream <> True
        sessionOutput = sessionOutput & vbCrLf & citrixServer & oExec.StdOut.ReadLine
    Loop

Next

count = 0
sessions = split(sessionOutput, vbCrLf)
wscript.echo

For Each session In sessions
    if InStr(session, "wdica") and InStr(session, "Disc") then wscript.echo session
Next

For Each session In sessions
    if InStr(session, "wdica") and InStr(session, "Active") then wscript.echo session
Next

For Each session In sessions
    if InStr(session, "wdica") and InStr(session, "Disc") then resetSession(session)
Next

For Each session In sessions
    if InStr(session, "wdica") and InStr(session, "Active") then resetSession(session)
Next

msgbox "Reset " & count & " Citrix session(s) for " & userName

CLSID error 80040154

June 18th, 2009 by Geoff Kendal No Comments

I’ve got a c# app that I’ve developed, and am now trying to compile on my new system I’ve had a few problems, biggest one being at the line: ‘NotesSession session = new NotesSession();’ ….I’m sure it compiled ok on my last system..hm!

I get the error….CLSID {blahblah} failed with error 80040154.

Turns out that Visual studio was compiling for “Any CPU”, this needs changing to x86, as the notes COM objects don’t do the x64 shizzle. All makes sense now, as new laptop is 64-bit!!

App now works and I’m a bit happier!

Accessing servers with DNS aliases

May 21st, 2009 by Geoff Kendal No Comments

When trying to access a windows server via a DNS alias (e.g. using \\fileserver.company.co.uk that is an alias of \\SERVER12), you will probably get a ‘duplicate name exists on the network’ error. This is because the default behaviour of windows only permits using the proper name of the server (SERVER12 in this case, or a bound IP address). This applies to both CNAMEs and A records in DNS.

You might have aliases set up so that if you ever move a service onto a different server, all you have to do is update the alias.

To enable a windows server to respond to aliases like this, you’ll need to edit the registry. Navigate to:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters

Then add a new DWORD value, called DisableStrictNameChecking and the the value to 1.

Once this is done, you’ll need to restart the server service, after that you should be able to access the server using the alias name!

Windows 7 default explorer location

May 12th, 2009 by Geoff Kendal No Comments

In Windows 7, it’s been annoying me for a while how the windows explorer item on the taskbar always default to my libraries, as on most systems I use they are empty.

You can change the location by holding shift and right clicking on the taskbar item so you can select properties in the context menu (If you’ve already got explorer windows open, you’ll need to right click the taskbar item once, then hold shift and right click on the Windows Explorer entry.)

Once in the properties window, if you set the target to the following, it will open ‘My Computer’ by default…

%SystemRoot%\explorer.exe /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}