You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
394 lines
10 KiB
394 lines
10 KiB
package Win32::NetResource;
|
|
|
|
require Exporter;
|
|
require DynaLoader;
|
|
require AutoLoader;
|
|
|
|
$VERSION = '0.052';
|
|
|
|
@ISA = qw(Exporter DynaLoader);
|
|
# Items to export into callers namespace by default. Note: do not export
|
|
# names by default without a very good reason. Use EXPORT_OK instead.
|
|
# Do not simply export all your public functions/methods/constants.
|
|
@EXPORT = qw(
|
|
RESOURCEDISPLAYTYPE_DOMAIN
|
|
RESOURCEDISPLAYTYPE_FILE
|
|
RESOURCEDISPLAYTYPE_GENERIC
|
|
RESOURCEDISPLAYTYPE_GROUP
|
|
RESOURCEDISPLAYTYPE_SERVER
|
|
RESOURCEDISPLAYTYPE_SHARE
|
|
RESOURCEDISPLAYTYPE_TREE
|
|
RESOURCETYPE_ANY
|
|
RESOURCETYPE_DISK
|
|
RESOURCETYPE_PRINT
|
|
RESOURCETYPE_UNKNOWN
|
|
RESOURCEUSAGE_CONNECTABLE
|
|
RESOURCEUSAGE_CONTAINER
|
|
RESOURCEUSAGE_RESERVED
|
|
RESOURCE_CONNECTED
|
|
RESOURCE_GLOBALNET
|
|
RESOURCE_REMEMBERED
|
|
);
|
|
|
|
@EXPORT_OK = qw(
|
|
GetSharedResources
|
|
AddConnection
|
|
CancelConnection
|
|
WNetGetLastError
|
|
GetError
|
|
GetUNCName
|
|
NetShareAdd
|
|
NetShareCheck
|
|
NetShareDel
|
|
NetShareGetInfo
|
|
NetShareSetInfo
|
|
);
|
|
|
|
=head1 NAME
|
|
|
|
Win32::NetResource - manage network resources in perl
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use Win32::NetResource;
|
|
|
|
$ShareInfo = {
|
|
'path' => "C:\\MyShareDir",
|
|
'netname' => "MyShare",
|
|
'remark' => "It is good to share",
|
|
'passwd' => "",
|
|
'current-users' =>0,
|
|
'permissions' => 0,
|
|
'maxusers' => -1,
|
|
'type' => 0,
|
|
};
|
|
|
|
Win32::NetResource::NetShareAdd( $ShareInfo,$parm )
|
|
or die "unable to add share";
|
|
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
This module offers control over the network resources of Win32.Disks,
|
|
printers etc can be shared over a network.
|
|
|
|
=head1 DATA TYPES
|
|
|
|
There are two main data types required to control network resources.
|
|
In Perl these are represented by hash types.
|
|
|
|
=over 10
|
|
|
|
=item %NETRESOURCE
|
|
|
|
KEY VALUE
|
|
|
|
'Scope' => Scope of an Enumeration
|
|
RESOURCE_CONNECTED,
|
|
RESOURCE_GLOBALNET,
|
|
RESOURCE_REMEMBERED.
|
|
|
|
'Type' => The type of resource to Enum
|
|
RESOURCETYPE_ANY All resources
|
|
RESOURCETYPE_DISK Disk resources
|
|
RESOURCETYPE_PRINT Print resources
|
|
|
|
'DisplayType' => The way the resource should be displayed.
|
|
RESOURCEDISPLAYTYPE_DOMAIN
|
|
The object should be displayed as a domain.
|
|
RESOURCEDISPLAYTYPE_GENERIC
|
|
The method used to display the object does not matter.
|
|
RESOURCEDISPLAYTYPE_SERVER
|
|
The object should be displayed as a server.
|
|
RESOURCEDISPLAYTYPE_SHARE
|
|
The object should be displayed as a sharepoint.
|
|
|
|
'Usage' => Specifies the Resources usage:
|
|
RESOURCEUSAGE_CONNECTABLE
|
|
RESOURCEUSAGE_CONTAINER.
|
|
|
|
'LocalName' => Name of the local device the resource is
|
|
connected to.
|
|
|
|
'RemoteName' => The network name of the resource.
|
|
|
|
'Comment' => A string comment.
|
|
|
|
'Provider' => Name of the provider of the resource.
|
|
|
|
=back
|
|
|
|
=item %SHARE_INFO
|
|
|
|
This hash represents the SHARE_INFO_502 struct.
|
|
|
|
=over 10
|
|
|
|
KEY VALUE
|
|
'netname' => Name of the share.
|
|
'type' => type of share.
|
|
'remark' => A string comment.
|
|
'permissions' => Permissions value
|
|
'maxusers' => the max # of users.
|
|
'current-users' => the current # of users.
|
|
'path' => The path of the share.
|
|
'passwd' => A password if one is req'd
|
|
|
|
=back
|
|
|
|
=head1 FUNCTIONS
|
|
|
|
=head2 NOTE
|
|
|
|
All of the functions return false if they fail.
|
|
|
|
=over 10
|
|
|
|
=item GetSharedResources(\@Resources,dwType,\%NetResource = NULL)
|
|
|
|
Creates a list in @Resources of %NETRESOURCE hash references.
|
|
|
|
The return value indicates whether there was an error in accessing
|
|
any of the shared resources. All the shared resources that were
|
|
encountered (until the point of an error, if any) are pushed into
|
|
@Resources as references to %NETRESOURCE hashes. See example
|
|
below. The \%NetResource argument is optional. If it is not supplied,
|
|
the root (that is, the topmost container) of the network is assumed,
|
|
and all network resources available from the toplevel container will
|
|
be enumerated.
|
|
|
|
=item AddConnection(\%NETRESOURCE,$Password,$UserName,$Connection)
|
|
|
|
Makes a connection to a network resource specified by %NETRESOURCE
|
|
|
|
=item CancelConnection($Name,$Connection,$Force)
|
|
|
|
Cancels a connection to a network resource connected to local device
|
|
$name.$Connection is either 1 - persistent connection or 0, non-persistent.
|
|
|
|
=item WNetGetLastError($ErrorCode,$Description,$Name)
|
|
|
|
Gets the Extended Network Error.
|
|
|
|
=item GetError( $ErrorCode )
|
|
|
|
Gets the last Error for a Win32::NetResource call.
|
|
|
|
=item GetUNCName( $UNCName, $LocalPath );
|
|
|
|
Returns the UNC name of the disk share connected to $LocalPath in $UNCName.
|
|
|
|
=head2 NOTE
|
|
|
|
$servername is optional for all the calls below. (if not given the
|
|
local machine is assumed.)
|
|
|
|
=item NetShareAdd(\%SHARE,$parm_err,$servername = NULL )
|
|
|
|
Add a share for sharing.
|
|
|
|
=item NetShareCheck($device,$type,$servername = NULL )
|
|
|
|
Check if a share is available for connection.
|
|
|
|
=item NetShareDel( $netname, $servername = NULL )
|
|
|
|
Remove a share from a machines list of shares.
|
|
|
|
=item NetShareGetInfo( $netname, \%SHARE,$servername=NULL )
|
|
|
|
Get the %SHARE_INFO information about the share $netname on the
|
|
server $servername.
|
|
|
|
=item NetShareSetInfo( $netname,\%SHARE,$parm_err,$servername=NULL)
|
|
|
|
Set the information for share $netname.
|
|
|
|
=back
|
|
|
|
=head1 EXAMPLE
|
|
|
|
|
|
#
|
|
# This example displays all the share points in the entire
|
|
# visible part of the network.
|
|
#
|
|
|
|
use strict;
|
|
use Win32::NetResource qw(:DEFAULT GetSharedResources GetError);
|
|
my $resources = [];
|
|
unless(GetSharedResources($resources, RESOURCETYPE_ANY)) {
|
|
my $err = undef;
|
|
GetError($err);
|
|
warn Win32::FormatMessage($err);
|
|
}
|
|
|
|
foreach my $href (@$resources) {
|
|
next if ($$href{DisplayType} != RESOURCEDISPLAYTYPE_SHARE);
|
|
print "-----\n";
|
|
foreach( keys %$href){
|
|
print "$_: $href->{$_}\n";
|
|
}
|
|
}
|
|
|
|
=head1 AUTHOR
|
|
|
|
Jesse Dougherty for Hip Communications.
|
|
|
|
Additional general cleanups and bug fixes by Gurusamy Sarathy <[email protected]>.
|
|
|
|
=cut
|
|
|
|
sub AUTOLOAD {
|
|
# This AUTOLOAD is used to 'autoload' constants from the constant()
|
|
# XS function. If a constant is not found then control is passed
|
|
# to the AUTOLOAD in AutoLoader.
|
|
|
|
my($constname);
|
|
($constname = $AUTOLOAD) =~ s/.*:://;
|
|
#reset $! to zero to reset any current errors.
|
|
$!=0;
|
|
my $val = constant($constname, @_ ? $_[0] : 0);
|
|
if ($! != 0) {
|
|
if ($! =~ /Invalid/) {
|
|
$AutoLoader::AUTOLOAD = $AUTOLOAD;
|
|
goto &AutoLoader::AUTOLOAD;
|
|
}
|
|
else {
|
|
($pack,$file,$line) = caller;
|
|
die "Your vendor has not defined Win32::NetResource macro $constname, used at $file line $line.
|
|
";
|
|
}
|
|
}
|
|
eval "sub $AUTOLOAD { $val }";
|
|
goto &$AUTOLOAD;
|
|
}
|
|
|
|
sub AddConnection
|
|
{
|
|
my $h = $_[0];
|
|
die "AddConnection: HASH reference required" unless ref($h) eq "HASH";
|
|
|
|
#
|
|
# The last four items *must* not be deallocated until the
|
|
# _AddConnection() completes (since the packed structure is
|
|
# pointing into these values.
|
|
#
|
|
my $netres = pack( 'i4 p4', $h->{Scope},
|
|
$h->{Type},
|
|
$h->{DisplayType},
|
|
$h->{Usage},
|
|
$h->{LocalName},
|
|
$h->{RemoteName},
|
|
$h->{Comment},
|
|
$h->{Provider});
|
|
_AddConnection($netres,$_[1],$_[2],$_[3]);
|
|
}
|
|
|
|
#use Data::Dumper;
|
|
|
|
sub GetSharedResources
|
|
{
|
|
die "GetSharedResources: ARRAY reference required"
|
|
unless ref($_[0]) eq "ARRAY";
|
|
|
|
my $aref = [];
|
|
|
|
# Get the shared resources.
|
|
|
|
my $ret;
|
|
|
|
if (@_ > 2 and $_[2]) {
|
|
my $netres = pack('i4 p4', @{$_[2]}{qw(Scope
|
|
Type
|
|
DisplayType
|
|
Usage
|
|
LocalName
|
|
RemoteName
|
|
Comment
|
|
Provider)});
|
|
$ret = _GetSharedResources( $aref , $_[1], $netres );
|
|
}
|
|
else {
|
|
$ret = _GetSharedResources( $aref , $_[1] );
|
|
}
|
|
|
|
# build the array of hashes in $_[0]
|
|
# print Dumper($aref);
|
|
foreach ( @$aref ) {
|
|
my %hash;
|
|
@hash{'Scope',
|
|
'Type',
|
|
'DisplayType',
|
|
'Usage',
|
|
'LocalName',
|
|
'RemoteName',
|
|
'Comment',
|
|
'Provider'} = split /\001/, $_;
|
|
push @{$_[0]}, \%hash;
|
|
}
|
|
|
|
$ret;
|
|
}
|
|
|
|
sub NetShareAdd
|
|
{
|
|
my $shareinfo = _hash2SHARE( $_[0] );
|
|
_NetShareAdd($shareinfo,$_[1], $_[2] || "");
|
|
}
|
|
|
|
sub NetShareGetInfo
|
|
{
|
|
my ($netinfo,$val);
|
|
$val = _NetShareGetInfo( $_[0],$netinfo,$_[2] || "");
|
|
%{$_[1]} = %{_SHARE2hash( $netinfo )};
|
|
$val;
|
|
}
|
|
|
|
sub NetShareSetInfo
|
|
{
|
|
my $shareinfo = _hash2SHARE( $_[1] );
|
|
_NetShareSetInfo( $_[0],$shareinfo,$_[2],$_[3] || "");
|
|
}
|
|
|
|
|
|
# These are private functions to work with the ShareInfo structure.
|
|
# please note that the implementation of these calls requires the
|
|
# SHARE_INFO_502 level of information.
|
|
|
|
sub _SHARE2hash
|
|
{
|
|
my %hash = ();
|
|
@hash{'type',
|
|
'permissions',
|
|
'maxusers',
|
|
'current-users',
|
|
'remark',
|
|
'netname',
|
|
'path',
|
|
'passwd'} = unpack('i4 A257 A81 A257 A257',$_[0]);
|
|
|
|
return \%hash;
|
|
}
|
|
|
|
sub _hash2SHARE
|
|
{
|
|
my $h = $_[0];
|
|
die "Argument must be a HASH reference" unless ref($h) eq "HASH";
|
|
|
|
return pack 'i4 a257 a81 a257 a257',
|
|
@$h{'type',
|
|
'permissions',
|
|
'maxusers',
|
|
'current-users',
|
|
'remark',
|
|
'netname',
|
|
'path',
|
|
'passwd'};
|
|
}
|
|
|
|
|
|
bootstrap Win32::NetResource;
|
|
|
|
1;
|
|
__END__
|