#RequireAdmin #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=..\..\Pictures\Icons\Transformer.ico #AutoIt3Wrapper_Outfile=Vss-Morronic.exe #AutoIt3Wrapper_Outfile_x64=Vss-Morronic64.exe #AutoIt3Wrapper_Compile_Both=y #AutoIt3Wrapper_UseX64=y #AutoIt3Wrapper_Res_Comment=Vss-Morronic.exe #AutoIt3Wrapper_Res_Description=Vss-Morronic.exe #AutoIt3Wrapper_Res_Fileversion=1.0.0.1 #AutoIt3Wrapper_Res_ProductVersion=1.0.0.1 #AutoIt3Wrapper_Res_LegalCopyright= #AutoIt3Wrapper_Res_Language=1033 #AutoIt3Wrapper_Res_Field=ProductName|Vss-Morronic.exe #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include #include #include #include Global $File = @TempDir & "\Shadows.txt" Global $IniFile = @TempDir & "\Vss-Settings.ini" If FileExists($File) Then FileDelete($File) Do RunWait(@ComSpec & " /C vssadmin list shadows > %temp%\Shadows.txt", "", @SW_HIDE) ;MOST ESSENTIAL PIECE. WITHOUT IT THERE IS NO APPLICATION. CHECK OUT VSSADMIN ON TECHNET SITE : https://technet.microsoft.com/en-us/library/cc754968.aspx Local $Fileexists = FileExists($File) If Not $Fileexists Then Local $Msg = MsgBox(20, "Error", "There was a problem getting the shadow copies. Try running as an administrator." & @CRLF & @CRLF & "Would you like to try again?") If $Msg = 7 Then Exit EndIf Until $Fileexists Or $Msg = 7 TraySetState(2) ;I LIKE TO HIDE THE TRAY IF I DON'T ADD A GRAPHICAL INTERFACE TO IT. Func _GetInfo($SplitStr, $SearchStr) ;THIS UDF GRABS INFORMATION FROM THE CREATED $FILE NEEDED TO SETUP THE LISTVIEW TABLE SO THE USER CAN CHOOSE. $FileOpen = FileOpen($File, 0) $FileRead = FileReadToArray($FileOpen) FileClose($FileOpen) Local $UseIt = "" For $i = 0 To UBound($FileRead) - 1 Step 1 Local $SearchString = StringInStr($FileRead[$i], $SearchStr) If $SearchString Then $tmp = StringSplit($FileRead[$i], $SplitStr, 1) If $UseIt = "" Then $UseIt = $tmp[2] Else $UseIt = $UseIt & "," & $tmp[2] EndIf EndIf Next Return $UseIt EndFunc ;==>_GetInfo Func _GetLetters() ; GET LETTERS OF SHADOWS AVAILABLE $FileOpen = FileOpen($File, 0) $FileRead = FileReadToArray($FileOpen) FileClose($FileOpen) Local $UseIt = "" For $i = 0 To UBound($FileRead) - 1 Step 1 Local $SearchString = StringInStr($FileRead[$i], "Original Volume: ") If $SearchString Then $tmp = StringSplit($FileRead[$i], "(", 1) If $UseIt = "" Then $UseIt = $tmp[2] Else $UseIt = $UseIt & "," & $tmp[2] EndIf EndIf Next $UseIt = StringSplit($UseIt, ")") Local $it = "" For $i = 1 To $UseIt[0] Step 1 If $it = "" Then $it = $UseIt[1] Else $it = $it & "," & $UseIt[1] EndIf Next $UseIt = StringSplit($it, ",") Return $UseIt EndFunc ;==>_GetLetters Func ShowMain() ;CREATES A GRAPHICAL USER INTERFACE TO USE Local $Dates = _GetInfo("time:", "Contained 1 shadow copies at creation time: ") Local $Names = _GetInfo("Volume:", "Shadow Copy Volume: ") Local $Letters = _GetLetters() Global $guiMain = GUICreate("Vss Morronic", 650, 400, -1, -1) GUISetFont(11, 400, "", "Segoe ui") Global $ListView = GUICtrlCreateListView("Time | Letter| Name", 10, 10, 630, 300) Global $ButtonMount = GUICtrlCreateButton("Mount", 265, 330, 110, 30) GUISetState(@SW_SHOW) $Dates = StringSplit($Dates, ",") $Names = StringSplit($Names, ",") For $i = 1 To $Dates[0] Step 1 GUICtrlCreateListViewItem($Dates[$i] & "|" & $Letters[$i] & "|" & $Names[$i], $ListView) Next _GUICtrlListView_SetColumnWidth($ListView, 0, $LVSCW_AUTOSIZE) _GUICtrlListView_SetColumnWidth($ListView, 1, $LVSCW_AUTOSIZE_USEHEADER) _GUICtrlListView_SetColumnWidth($ListView, 2, $LVSCW_AUTOSIZE) While 1 Local $nmsg = GUIGetMsg() Switch $nmsg Case $GUI_EVENT_CLOSE If FileExists($IniFile) Then Local $Msg = MsgBox(68, "Please Answer", "Would you like to un-mount the shares?" & @CRLF & @CRLF & "If you click no, be sure to open C:\ and delete the mounted folders", 15) If $Msg = 6 Then ;IF USER CLICKS YES TO REMOVE MOUNTS For $i = 1 To 30 Step 1 ;THIS CHECKS FOR ALREADY MOUNTED NAMES TYPED IN BY THE USER. HOPEFULLY THEIR WON'T BE MORE THAN 30 SHADOWS MOUNTED AT A TIME.. Local $FileRead = IniRead($IniFile, "Mounts", "Mount-" & $i, "ERROR") If $FileRead <> "ERROR" Then If FileExists("C:\" & $FileRead) Then DirRemove("C:\" & $FileRead) EndIf Next FileDelete($File) FileDelete($IniFile) Exit EndIf Else If FileExists($IniFile) Then FileDelete($IniFile) FileDelete($File) Exit EndIf Case $ButtonMount Local $iIndex = _GUICtrlListView_GetSelectedIndices($ListView) ;GETS THE INDEX OF SELECTED LISTVIEW ITEM Local $Split = StringSplit(GUICtrlRead(GUICtrlRead($ListView)), "|") ;READS THE SELECTED LISTVIEW ITEM AND PUTS IT INTO AN ARRAY If $Split[1] = 0 Then ;DO NOTHING IF NOTHING IS SELECTED AND THE MOUNT BUTTON IS PUSHED Else Local $i = 0 Do ;CHECKS FOR THE DEFUALT MNT-1 ON THE C DRIVE. IF THERE IS ONE IT COUNTS ONE UP SO IT DOESN'T GENERATE THE SAME NAME. $i = $i + 1 Local $Fileexists = FileExists("C:\MNT-" & $i) Until $Fileexists = 0 Local $Input = InputBox("Vss Morronic", "Please type a name for the folder name to mount. It can't contain \ / : * ?" & ' "' & " < > |" & @CRLF & "Default is MNT-" & $i, "MNT-" & $i) If @error Then ;DO NOTHING IF CANCEL OR THE X ARE PRESSED Else Local $Count = 1 For $i = 1 To 30 Step 1 ;THIS CHECKS FOR ALREADY MOUNTED NAMES. HOPEFULLY THEIR WON'T BE MORE THAN 30 SHADOWS MOUNTED AT A TIME.. Local $FileRead = IniRead($IniFile, "Mounts", "Mount-" & $i, "ERROR1") If $FileRead = "ERROR1" Then $Count = $i ExitLoop EndIf Next IniWrite($IniFile, "Mounts", "Mount-" & $Count, $Input) RunWait(@ComSpec & ' /C mklink /D "c:\' & $Input & '" ' & $Split[3] & '\', "", @SW_HIDE) ;CODE THAT MOUNTS SHADOW COPY, $Split[3] IS THE NAME OF THE SELECTED SHADOW POINT. If Not FileExists("C:\" & $Input) Then MsgBox(16, "Error: Failed", "Failed to mount C:\" & $Input & ". Remember the name can't contain \ / : * ?" & ' "' & " < > |" & @CRLF & @CRLF & "Please try again", 15) Else _GUICtrlListView_DeleteItem($ListView, $iIndex) ;DELETES THE SELECTED ITEM FROM THE LISTVIEW BOX SO IT ISN'T MOUNTED AGAIN. Run('explorer.exe "C:\' & $Input & '"') EndIf EndIf EndIf EndSwitch WEnd EndFunc ;==>ShowMain ShowMain()