Skip to content

Instantly share code, notes, and snippets.

@nrk
Created September 7, 2008 19:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nrk/9299 to your computer and use it in GitHub Desktop.
Save nrk/9299 to your computer and use it in GitHub Desktop.
How to map a network share in Windows with Ruby & Win32API
require 'Win32API'
module NetworkDrive
CONNECT_UPDATE_PROFILE = 0x1
RESOURCE_CONNECTED = 0x1
RESOURCE_GLOBALNET = 0x2
RESOURCETYPE_DISK = 0x1
RESOURCEDISPLAYTYPE_SHARE = 0x3
RESOURCEUSAGE_CONNECTABLE = 0x1
# http://msdn.microsoft.com/en-us/library/aa385413(VS.85).aspx
@@add_connection = Win32API.new('mpr', 'WNetAddConnection2', 'PPPP', 'I')
# http://msdn.microsoft.com/en-us/library/aa385427(VS.85).aspx
@@remove_connection = Win32API.new('mpr', 'WNetCancelConnection2', 'PII', 'I')
def self.map(local_name, remote_name, username = nil, password = nil)
# http://msdn.microsoft.com/en-us/library/aa385353(VS.85).aspx
netresource_struct = [
RESOURCE_GLOBALNET, # dwScope
RESOURCETYPE_DISK, # dwType
RESOURCEDISPLAYTYPE_SHARE, # dwDisplayType
RESOURCEUSAGE_CONNECTABLE, # dwUsage
local_name, # lpLocalName
remote_name, # lpRemoteName
nil, # lpComment
nil, # lpProvider
]
return_value = @@add_connection.call(
netresource_struct.pack('LLLLPPPP'), # lpNetResource
username, # lpPassword
password, # lpUsername
CONNECT_UPDATE_PROFILE # dwFlags
)
raise SystemCallError.new(return_value) if (return_value != 0)
end
def self.disconnect(local_name, force = false)
return_value = @@remove_connection.call(
local_name, # lpPassword
CONNECT_UPDATE_PROFILE, # dwFlags
force ? 1 : 0 # fForce
)
raise SystemCallError.new(return_value) if (return_value != 0)
end
end
# usage:
# NetworkDrive.map('o:', '\\\\192.168.1.1\\NetworkShare')
# NetworkDrive.disconnect('o:')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment