I have decided what the Power of scripting script should do! If you move a share by moving it in windows explorer the share will stop work. If you move the folder with File System Object from vbscript the share will still be there but will be pointing at the old path that no longer exists. So how to solve this?
I know a few ways that you don't. First attempt was to use the winnt://localhost/lanmanserver/ object to try updating the path of the share. No luck the property is read only!
Next attempt was using WMI instead. Same thing, unable to update the path. So i thought I delete the share and then create it again. Well enough that worked how ever I didn't manage to get the rights for the share to come along to the new one. There is methods to extract the access mask for the share and supply it when creating a new one, so I think it can be solved. I didn't have the time to do so this time and I think I proved my point about the power of scripting.
At the same time I have learned or realized a few things that I didn't thought about. Most scripts I have written in the past has been for controlled environments. By that I mean a system where a specific task was asked from the script and the run was always with the same parameters. Here I'm writing a script that should run on different versions of the operating system and with several different variables.
So some of the limitations I ran into can be expressed in the words: Access Denied! It was issues with running some of the commands from the script without running it with elevation. This is no issue running it from the command prompt with cscript moveshare.vbs as long as you start the cmd with elevation (right-click and select Run As Administrator). There are ways around this even with the "double-click execution" of scripts that are discussed in detail here.
So the window version of the script is pretty useless with a standard setup. How ever if you run the script with elevation from the cmd you will be able to move shares around on the disk. The script is pretty ruff around the edges and some more error handling and stuff needs to be added. There probably will be solvable to get the share to keep it's access list as well. This script should be seen as a proof of concept.
'******************************************************************************************** '* '* Power of scripting challange! '* '* moveshare.vbs '* '* Purpose: Move a shared folder from one location to another '* without losing the share! '* '* Written by Kristofer Källsbo '* '* http://www.hackviking.com '* '******************************************************************************************** Option explicit Dim FSO 'Get the filesystem object ready Set FSO = CreateObject("Scripting.FileSystemObject") 'First check if we are running in console mode or window mode If (InStr(1, WScript.FullName, "cscript", vbTextCompare)) Then InitConsole ElseIf (InStr(1, WScript.FullName, "wscript", vbTextCompare)) Then InitWindow Else ' Hope this never fires!
wscript.echo "How the hell did you start this script?" End If 'Clean up Set FSO = Nothing 'Handles the command line run of the script Sub InitConsole() 'Check if we have any parameters If (Wscript.Arguments.Count < 2) Then 'Display help wscript.echo "Move share script" wscript.echo "" wscript.echo "Use: cscript moveshare.vbs {source} {destination}" wscript.echo "" wscript.echo "source = complete path of the shared folder" wscript.echo "destination = full path of the folder where the shared folder should be moved" wscript.echo "" wscript.echo "moveshare.vbs Kristofer Källsbo http://www.hackviking.com" Else 'Verrify the parameters Dim sourcePath, destPath sourcePath = Wscript.Arguments(0) destPath = Wscript.Arguments(1) If Not (FSO.FolderExists(sourcePath)) Then 'Display error wscript.echo "Source path was not found!" Exit Sub End If If Not (FSO.FolderExists(destPath)) Then 'Display error wscript.echo "Destination path was not found!" 'End this execution run Exit Sub End If 'Do the move wscript.echo MoveShare(sourcePath, destPath) End If End Sub 'Handles the double click run of the script Sub InitWindow() Dim sourcePath, destPath, msgboxRetval 'Get source path from user sourcePath = InputBox("This script will move an entire shared folder to a new location withou losing the share!" & vbNewLine & vbNewLine & "Enter path of share:", "Move Share Script") 'Validate source path If (sourcePath = "") Then 'Display error and end it msgboxRetval = MsgBox("Source path not entered or cancel was clicked!", vbOKOnly+vbCritical, "Source path error!") Exit Sub Else 'Check that path exists If Not (FSO.FolderExists(sourcePath)) Then 'Display error msgboxRetval = MsgBox("Source path was not found!", vbRetryCancel+vbCritical+vbDefaultButton1, "Source path error!") 'Check if user wants to retry If (msgboxRetval = 4) Then InitWindow End If 'End this execution run Exit Sub End If End if 'Get destination path from user destPath = InputBox("Enter destination path of share:", "Move share script") 'Validate destination path If (destPath = "") Then 'Display error and end it msgboxRetval = MsgBox("Destination path not entered or cancel was clicked!", vbOKOnly+vbCritical, "Destination path error!") Exit Sub Else 'Check that path exists If Not (FSO.FolderExists(destPath)) Then 'Display error msgboxRetval = MsgBox("Destination path was not found!", vbRetryCancel+vbCritical+vbDefaultButton1, "Destination path error!") 'Check if user wants to retry If (msgboxRetval = 4) Then InitWindow End If 'End this execution run Exit Sub End If End If 'We are all good to go, lets move wscript.echo MoveShare(sourcePath, destPath) End Sub Function MoveShare(sourcePath, destPath) Dim retval, objWMI, objInstances, objInstance, sourceFolder, sourceName, AccessMask, AllowMaximum, Caption, Description, MaximumAllowed, Name, shareType, delRetval, objNewShare, createRetval 'Add a \ to the destpath, making shure it will be treated as a folder destPath = destPath & "\" 'Get the shares Set objWMI = GetObject("winmgmts://./root\cimv2") Set objInstances = objWMI.InstancesOf("Win32_Share",48) 'Get the correct folder path with upper and lower cases Set sourceFolder = FSO.GetFolder(sourcePath) sourcePath = sourceFolder.Path sourceName = sourceFolder.Name 'Get the share 'On Error Resume Next For Each objInstance in objInstances If(objInstance.Path = sourcePath) Then 'Store all the options With objInstance AccessMask = .AccessMask AllowMaximum = .AllowMaximum Caption = .Caption Description = .Description MaximumAllowed = .MaximumAllowed Name = .Name shareType = .Type End With 'Delete the share delRetval = objInstance.Delete() 'Check that delete worked If Not(delRetval = 0) Then retval = "Error: Unable to delete share!" & vbNewLine & "Error code: " & delRetval MoveShare = retval Exit Function End If End If Next On Error Goto 0 'Move the folder FSO.MoveFolder sourcePath, destPath 'Setup the share in the new location Set objNewShare = objWMI.Get("Win32_Share") createRetval = objNewShare.Create(destPath & sourceName, Name, shareType, MaximumAllowed, Description, null, null) 'Check that the new share was created If Not(createRetval = 0) Then retval = "Error: New share not created!" End If 'Return result MoveShare = retval End Function