Opening SMB/CIFS shared files using the Mozilla or Opera browser
See the full article below the updates.
For the impatient: download, save in C:\WINDOWS,
Start -> Run -> "smburl3b.vbs register" (no quotes). Run it as administrator
on Vista or Windows 7 or see alternatives below in the 2009-12-07 update box.
For a similar approach using a separate .reg file and and a one-line .cmd script that calls explorer.exe
see cabo.dk
(off-site).
2009-12-07 - update
Reports have come in that the script does not work on Windows Vista.
> Script: C:\Windows\smburl3b.vbs > Line: 168 > Char: 5 > Error: Invalid root in registry key > "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb\". > Code: 80070005 > Source: WshShell.RegWrite
This is a security issue. You can either run the script as administrator
when registering (the 'register' argument), or replace all occurrences of
HKEY_LOCAL_MACHINE
with HKEY_CURRENT_USER
. The
latter option only installs the handler for the currently logged on user.
2008-10-11 - update
The script now assumes all url-encoded characters above 0x7f are encoded UTF-8. This should be correct for the majority of modern browsers. Get the updated script (view).
2008-09-07 - update
What has been changed, is really a bugfix. Spaces aren't allowed in URLs. And nowadays the browsers replace the space with a %20 — mostly as a precaution against vulnerabilities like this. In the LAN search engine that I wrote ages ago, I had forgotten to escape the illegal spaces in the generated URLs. Therefore everything worked just fine until this change happened. While really my URLs should have been broken from the beginning.
So, without further ado, here is an updated version
(view), called smburl3a.vbs
.
This one will urldecode all but
the reserved characters. If you were generating smb://
-URLs, make sure you
escape spaces with %20
and percent signs with %25
.
My changes did not include the replacing of pluses (+
) with spaces.
Should I have added that as well? My initial thought was against, because it's easier
for both the URL-generating party and the script.
Thanks Gregory Fong for helping me focus on the issue.
2008-08-20 - update
Somehow the script is getting wrong arguments when spaces and percents are concerned.
I haven't had time to figure out what happens exactly, but smb://-urls with spaces
seem to be broken nowadays (with my IE7 and FireFox 2.0.0.16). When the URL is
smb://abc/d e/f%20g
the script receives smb://abc/d%20e/f%20g
.
That should be either smb://abc/d e/f%20g
or smb://abc/d%20e/f%2520g
to be usable.
2007-04-26 - update
I can do you one better though. This new and improved version needs only wscript.exe
which is installed on all Windowzes nowadays. Save it somewhere and run it with "register"
as argument. It will update the registry as necessary.
This one won't flash a cmd
window either, like the old one did.
Get it now: smburl3.vbs (view)
2007-03-07 - update
More people are using the same fix. See Firefox
file links for a solution with a C#
binary.
2005-12-07 - update
For those too lazy to read and do manual stuff. Two steps.
Fetch sh.exe
and put it in some directory in your %PATH%
. Fetch smbreg2.cmd
and run it.
CMD.EXE
batch programming sucks. I haven't found a way to
reliably escape the ampersand (&). So, we'll try a different
approach instead. You should already have sh.exe
-
you needed it for the old approach. We'll just run a zsh
script instead of a CMD.EXE
script.
Two things need to be changed: the actual script and the registry keys
that call the script. First the zsh
script; smburl.sh
:
#!/usr/bin/env zsh # vim:syn=zsh # smburl.sh -- zsh script to open smb:// links on windows. # Walter Doekes (C) 2005 -- License: Public Domain ARGS="$*" # Is it an smb:// link? if [[ "${ARGS[0,4]}" != "smb:" ]] { print "Unsupported format; please provide an smb:// URI." print "\nHit [ENTER]." read x exit 1 } # Change the URI from smb://server/share/dir/file to \\server\share\dir\file REPLACED="$ARGS" REPLACED="${REPLACED[5,-1]}" REPLACED="${REPLACED:gs|/|\\\\|}" # Run rundll with the file:// handler. rundll32.exe url.dll,FileProtocolHandler "$REPLACED" ## Uncomment the lines below for diagnostics #print "Tried to open:\n${REPLACED:gs/\\/\\\\\\\\/}\n\nHit [ENTER]." #read x
And the modified registry keys; smburl.reg
.
(We assume that you placed sh.exe
in your %PATH%
and smburl.sh
in C:\\WINDOWS
.)
REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb] @="URL:SMB URI" "URL Protocol"="" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb\DefaultIcon] @="\"C:\\WINDOWS\\explorer.exe\"" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb\Shell] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb\Shell\Open] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb\Shell\Open\Command] @="sh.exe \"C:\\WINDOWS\\smburl.sh\" %L"
06-09-2004 - update
Arjen Zonneveld has made a script that automates the process of creating the
necessary batch files. It also sets the correct path to the used windows
files (in the registry file below you had to edit g:\\winnt
to the correct path for your Windows install). After downloading
sh.exe
and sed.exe
(and placing them in a
directory that is defined in your %PATH%
) you can simply run smbreg.cmd
.
He also pointed out that this works with the Mozilla browser as well. You
won't even have to edit any settings in Mozilla.
2004 - original article
Abstract
The Opera browser by Norwegian Opera Software is a very capable browser.
One thing that has bothered me though, is the following: if you try to open
file://
links, opera will download them or - in the case of
directories - display it's own browse page. When using the search engine on
my Local Area Network, I want to be able to open files directly
instead of having to download them to my local drive first, so I was
stuck using Internet Explorer for all my LAN searching needs. I
couldn't find anything on the net that fixes this (setting a custom
file
protocol handler in Opera doesn't help), so I created a
workaround that uses the unused smb://
protocol.
Summary
- Create an
smb://
protocol handler in the Windows registry. - Create a shell script (batch file) that handles this protocol; namely by
reformatting the supplied arguments and feeding them to
rundll32.exe
. - Add the
smb://
protocol to the handlers in Opera. - Convince the admin of your LAN search engine to add
smb://
links to files and directories. This shouldn't be too hard because linux browsers often understand that protocol (and notfile://
).
Details
First we add the following to the Windows registry. Make sure you replace
C:\\PROGS\\Utils\\smb.cmd
with the filename of the batch file
you are to create next (name it .bat
if you're running Windows
95/98/ME). You can place this into a file called smb.reg
and
Merge it into the registry by double-clicking on it.
REGEDIT4 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb] @="URL:SMB URI" "URL Protocol"="" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb\DefaultIcon] @="g:\\winnt\\explorer.exe" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb\Shell] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb\Shell\Open] [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\smb\Shell\Open\Command] @="C:\\PROGS\\Utils\\smb.cmd %L"
Next we'll make a shell script (batch file). It requires two tools which you
most likely do not have installed; namely sed.exe
and sh.exe
, the
former to replace text input, and the latter to execute the replaced text (if
this can be done with the tools provided by Microsoft, please tell me how).
If you don't trust me, you can fetch the files from the UnxUtils package. Place the two
binaries in a directory in your %PATH%
(normally
C:\WINDOWS\
or C:\WINNT\
). After fetching the
files, create a file called smb.cmd
at the location you
specified in the registry above, with the following text:
@echo off rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rem Opens smb:// directory links with explorer.exe rem for use with Opera which insists using their own file:// handling rem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rem requires: explorer.exe or rundll32.exe, sh.exe, sed.exe rem rem rem Simple option -- doesn't do files. rem sh -c "explorer.exe `echo %1 | sed -e 's/^smb:/file:/'`" rem rem rem Complex option -- may show escaping issues rem sh -c "rundll32.exe url.dll,FileProtocolHandler `echo \"%*\" | sed -e s/^smb:// -e s:/:\\\\\\\\\\\\\\\\:g -e s/%%20/\\ /g`" sh -c "rundll32.exe url.dll,FileProtocolHandler `echo \"%*\" | sed -e s/^smb:// -e s:/:\\\\\\\\\\\\\\\\:g -e s/%%20/\\ /g`"
All the lines preceded by rem
are comments. The script takes the
supplied argument - which would look like
smb://SOMECOMPUTER/sharename/path/to/file.ext
- converts it to
something that rundll32.exe
understands - namely
\\SOMECOMPUTER\sharename\path\to\file.ext
- and feeds it to the
rundll32.exe
URL handler. Now you can click on
smb://
links and the appropriate associated program will open
the file.
The last step is telling Opera that it should handle smb://
links as well. Go to File -> Preferences -> Programs and
Paths. Hit Add, type smb
in the Protocol
field. Your custom handler should now appear in the Open with default
application text box. Select it, and you're done.
This procedure was tested with Windows 2000 SP4, the binaries supplied above and Opera version 7.22. Comments or suggestions can be mailed to walter AT djcvt DOT net. I'd love to hear the simple solution that isn't such a kludge.