xinx Posted August 12, 2011 Posted August 12, 2011 Hi all, I am trying to find a way that will allow me to get the sharename of a folder if I already know it's local or UNC path. SO far the code I have will show whether the folder is shared or not but does not display what the sharname is. Here's a snippet of the existing code: ------------------------------------------------------------------------ #include <WinAPIEx.au3> $sFolder = $ProfileShare $tSHFILEINFO = DllStructCreate($tagSHFILEINFO) _WinAPI_ShellGetFileInfo($sFolder, $SHGFI_ATTRIBUTES, 0, $tSHFILEINFO) $iAttributes = DllStructGetData($tSHFILEINFO, "Attributes") If BitAND($iAttributes, $SFGAO_SHARE) Then MsgBox (1, "Share info", "Shared") Else MsgBox (1, "Share info", "Not shared") EndIf ------------------------------------------------------------------------ ($ProfileShare is basically elswhere in my main program but simply points to C:\Test\Sharedfolder) What I want is to output the sharename of Sharedfolder (currently with a sharename of Shared) in the first message box - is this at all possible? Many thanks in advance!
sleepydvdr Posted August 13, 2011 Posted August 13, 2011 That's a tough one. I didn't find anything native in AutoIt that can do it. From what I can tell, you would have to look at this registry section: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\LanmanServer\Shares. From there, you would have to make a list of the shares on the computer, decode the paths from hex to strings and then compare your path to the ones from the share list to find a match. It's too late for me to attempt this tonight. Sorry. #include <ByteMe.au3>
xinx Posted August 13, 2011 Author Posted August 13, 2011 That's a tough one. I didn't find anything native in AutoIt that can do it. From what I can tell, you would have to look at this registry section: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\LanmanServer\Shares. From there, you would have to make a list of the shares on the computer, decode the paths from hex to strings and then compare your path to the ones from the share list to find a match. It's too late for me to attempt this tonight. Sorry.Many thanks for your reply - at least I've now got an idea of what to do haha but yeah I think it's a bit beyond my capabilities with AutoIT :-/
xinx Posted August 13, 2011 Author Posted August 13, 2011 Many thanks for your reply - at least I've now got an idea of what to do haha but yeah I think it's a bit beyond my capabilities with AutoIT :-/And if you can work this one out then I will be very thankful and also regard you as a pure genius!
BrewManNH Posted August 13, 2011 Posted August 13, 2011 On my Windows 7 x86 machine, I have a network drive which is the Z: drive. In the Registry is the "HKCU\Network\Z" key, there's a value called RemotePath, and in that value the string is a plain-text showing the exact path to the share drive. So, all you would need to do is get the list of your drive letters and determine which are network shares rather than connected drives, and look for the drive letter in that key. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator
xinx Posted August 13, 2011 Author Posted August 13, 2011 On my Windows 7 x86 machine, I have a network drive which is the Z: drive. In the Registry is the "HKCU\Network\Z" key, there's a value called RemotePath, and in that value the string is a plain-text showing the exact path to the share drive. So, all you would need to do is get the list of your drive letters and determine which are network shares rather than connected drives, and look for the drive letter in that key.Hi BrewManH,Many thanks for your advice, it is greatly appreciated :-) Sadly I'm working on Server 2008, and so there's no shared folders showing in HKCU\Network. I can see the sharenames of folders in HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\LanmanServer\Shares as sleepydvdr suggested but do now have the know-how to do the rest :-(
Yashied Posted August 15, 2011 Posted August 15, 2011 _Net_Share_ShareEnum() My UDFs: iKey | FTP Uploader | Battery Checker | Boot Manager | Font Viewer | UDF Keyword Manager | Run Dialog Replacement | USBProtect | 3D Axis | Calculator | Sleep | iSwitcher | TM | NetHelper | File Types Manager | Control Viewer | SynFolders | DLL Helper Animated Tray Icons UDF Library | Hotkeys UDF Library | Hotkeys Input Control UDF Library | Caret Shape UDF Library | Context Help UDF Library | Most Recently Used List UDF Library | Icons UDF Library | FTP UDF Library | Script Communications UDF Library | Color Chooser UDF Library | Color Picker Control UDF Library | IPHelper (Vista/7) UDF Library | WinAPI Extended UDF Library | WinAPIVhd UDF Library | Icon Chooser UDF Library | Copy UDF Library | Restart UDF Library | Event Log UDF Library | NotifyBox UDF Library | Pop-up Windows UDF Library | TVExplorer UDF Library | GuiHotKey UDF Library | GuiSysLink UDF Library | Package UDF Library | Skin UDF Library | AITray UDF Library | RDC UDF Library Appropriate path | Button text color | Gaussian random numbers | Header's styles (Vista/7) | ICON resource enumeration | Menu & INI | Tabbed string size | Tab's skin | Pop-up circular menu | Progress Bar without animation (Vista/7) | Registry export | Registry path jumping | Unique hardware ID | Windows alignment More...
BrewManNH Posted August 15, 2011 Posted August 15, 2011 The key for the share is located between the Path= and stops where Permissions= starts, get the key using RegRead, then use _StringBetween to find what the shared folder/drive path is. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator
xinx Posted August 15, 2011 Author Posted August 15, 2011 I'm quite new to AutoIT but from what I understand using RegRead will only work if I already know what the sharename is? So when I look in the registry I can see what the path name is but Here's what I am trying to do: On a server there are folders that may already be shared, for example g:\users\profiles is shared but we don't know what it is shared as (well we do, but we want this script to work that out) This has to work in such a way that when the script is run it will look for the path g:\users\profiles, remove it's existing sharename and add a new sharename. The problem I have is that when the folder already has an existing sharename and I use Net_Share_ShareAdd it will only add the possible sharename but not remove the old one. I found that I cannot use Net_Share_ShareDel unless I know what the sharename is. And I'm trying to do this for multiple folders :-/ which makes automation difficult... Any help greatly appreciatedcd
BrewManNH Posted August 15, 2011 Posted August 15, 2011 Look at RegEnumKey and RegEnumVal to get all the keys in the Shares registry setting and loop through it to find all of your shares. Look at the examples in the help file as to how to do that. If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag GudeHow to ask questions the smart way! I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from. Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator
xinx Posted August 15, 2011 Author Posted August 15, 2011 Right, so far this is what I've found: expandcollapse popup#include <array.au3> #include <File.au3> ;***************************************************** ; Function _RegSearch($sStartKey, $sSearchVal, $iType = 0x07, $fArray = False) ; Where: $sStartKey = Reg path at which to begin search ; $sSearchVal = The string to search for ; $iType = Matching types to return: ; 1 = Key names ; 2 = Value names ; 4 = Value data ; Add bits together for multiple match types, default is 7 (all) ; $fArray = Return an array of results vice the string (defualt = False) ; Performs a recursive search of the registry starting at $sStartKey, looking for $sSearchVal ; Returns a string containing a list of key names and values. ; If a key name matches, it is listed as a reg path with trailing backslash: ; i.e. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ ; If a value name matches, it is listed as a reg path without trailing backslash: ; i.e. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WallPaperDir ; If the data matches, the format is path = data: ; i.e. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WallPaperDir = %SystemRoot%\Web\Wallpaper ; If $fArray is True, then return data is an array with [0] = count. ;***************************************************** ; Change Log: ; v1.0.0.0 | 03/17/05 | Original SearchReg() by Holger ; v2.0.0.0 | 08/10/06 | Native AutoIt version by PsaltyDS ; v2.0.0.1 | 08/16/06 | Fixed bug reported by markloman ; v2.0.1.0 | 07/30/08 | Added $iType and $fArray parameters ; v2.0.2.0 | 11/12/08 | Fixed bug returning array [0] = 1 vice 0 for none found ; v2.0.3.0 | 06/22/10 | Fixed bug appending some result strings together reported by squid808 ;***************************************************** Func _RegSearch($sStartKey, $sSearchVal, $iType = 0x07, $fArray = False) Local $v, $sVal, $k, $sKey, $sFound = "", $sFoundSub = "", $avFound[1] = [0] ; Trim trailing backslash, if present If StringRight($sStartKey, 1) = "\" Then $sStartKey = StringTrimRight($sStartKey, 1) ; Generate type flags If Not BitAND($iType, 0x07) Then Return SetError(1, 0, 0); No returns selected Local $fKeys = BitAND($iType, 0x1), $fValue = BitAND($iType, 0x2), $fData = BitAND($iType, 0x4) ; This checks values and data in the current key If ($fValue Or $fData) Then $v = 1 While 1 $sVal = RegEnumVal($sStartKey, $v) If @error = 0 Then ; Valid value - test its name If $fValue And StringInStr($sVal, $sSearchVal) Then $sFound &= $sStartKey & "\" & $sVal & @LF ; test its data If $fData Then $readval = RegRead($sStartKey, $sVal) If StringInStr($readval, $sSearchVal) Then $sFound &= $sStartKey & "\" & $sVal & " = " & $readval & @LF EndIf EndIf $v += 1 Else ; No more values here ExitLoop EndIf WEnd EndIf ; This loop checks subkeys $k = 1 While 1 $sKey = RegEnumKey($sStartKey, $k) If @error = 0 Then ; Valid key - test it's name If $fKeys And StringInStr($sKey, $sSearchVal) Then $sFound &= $sStartKey & "\" & $sKey & "\" & @LF ; Now search it $sFoundSub = _RegSearch($sStartKey & "\" & $sKey, $sSearchVal, $iType, False) ; use string mode to test sub keys If $sFoundSub <> "" Then $sFound &= $sFoundSub & @LF Else ; No more keys here ExitLoop EndIf $k += 1 WEnd ; Return results If StringRight($sFound, 1) = @LF Then $sFound = StringTrimRight($sFound, 1) If $fArray Then If StringStripWS($sFound, 8) <> "" Then $avFound = StringSplit($sFound, @LF) Return $avFound Else Return $sFound EndIf EndFunc ;==>_RegSearch $hkeyloc="HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\LanmanServer\Shares" $sharepath="Path" $results=_regsearch($hkeyloc, $sharepath, 7, true) ;_arrayDisplay($results) ; commented out, used for checking only $sSearch = "G:\students\profiles" If @error Then Exit $iIndex = _ArraySearch($results, $sSearch, 0, 0, 0, 1) If $iIndex = -1 Then MsgBox (16, "Error", "No such path exists") Else MsgBox (64, "Result", $iIndex) EndIf So now what I am getting is the MsgBox displaying the value of $iIndex which for me shows as 127 - I check this against the _arrayDisplay($results) and indeed it is the correct path, however the sharename is two rows down in some instances and in others it is three rows after $iIndex (depending on if there are share comments). I've only put in the message box for testing purposes but once it displays the correct output then I know this program is working.
xinx Posted September 3, 2011 Author Posted September 3, 2011 Still no joy, any other ideas on how to get the pathname of a shared folder please?
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now