+ -
当前位置:首页 → 问答吧 → perl print 到winserver 2008的远程共享文件时如何验证用户

perl print 到winserver 2008的远程共享文件时如何验证用户

时间:2011-11-24

来源:互联网

我用open($MYFILE,">>\\\\192.168.**.**\\**\\**.txt");
print $MYFILE("$context\n");
输出文件信息到$MYFILE文件中,如果本机(XP系统)上没有设置过连接到这个目录的
账户密码信息。这个脚本就会出现permission denied的信息。
只有用有效的账户和密码登录过才可以。

所以想问有没有这样的验证脚本,直接把验证写在perl中就可以了
这样就不用在客户端进行设置了。

作者: astraydog   发布时间: 2011-11-24

http://code.activestate.com/lists/perl-win32-web/2223/
refer to
Perl code
package Remote::Filecopy;

use strict;
use warnings;

use constant SHARE_NAME => '\\\\a\\b';
use constant USER_NAME  => 'user';
use constant PASSWORD   => 'pw';

use Carp qw/ carp croak /;
use Win32::NetResource qw/ GetUNCName AddConnection CancelConnection /;
use Win32API::File qw/ CopyFile fileLastError /;

use Exporter;
use vars qw/ @ISA @EXPORT_OK $VERSION /;
@ISA     = qw/ Exporter /;
$VERSION = '0.1';

my $SHARE = {
     RemoteName => SHARE_NAME,
     LocalName  => undef,
};

push @EXPORT_OK, 'filecopy';
sub filecopy {
     my %args = @_;
     if( not defined $SHARE->{LocalName} ) {
         $SHARE->{LocalName} = free_drive_letter();
         if( not AddConnection( $SHARE, PASSWORD, USER_NAME, 0 )) {
             croak "share connection error:\n", win32err();
         }
     }
     CopyFile( $args{from}, "$SHARE->{LocalName}$args{to}", 0 )
         or carp "copy of [$args{from}] to 
[$SHARE->{LocalName}$args{to}] failed: "
             . fileLastError() . "\n";
}

sub free_drive_letter {
     my $drive;
     for my $letter ('f' .. 'z' ) {
         my $mapped;
         $drive = "$letter:";
         GetUNCName( $mapped, $drive );
         return $drive if not $mapped;
     }
     croak "All network drive letters (F: .. Z:) are in use\n";
}

END {
     if( defined $SHARE->{LocalName} ) {
         if( not CancelConnection( $SHARE->{LocalName}, 0, 1 )) {
             carp "disconnection error:\n", win32err();
         }
     }
}

sub win32err {
     my $err;
     Win32::NetResource::GetError($err);
     Win32::FormatMessage($err);
}
__END__

http://www.perlmonks.org/?node_id=491533

Perl code
use strict;
use warnings;

use Win32::NetResource qw/GetUNCName AddConnection CancelConnection/;
use Win32API::File qw/ CopyFile fileLastError /;

use constant SHARE_NAME => '\\\\remote_svr\\sharename'; # must use bac
+kslashes
use constant USER_NAME  => 'myusername';
use constant PASSWORD   => 'mysekretpassword';

my $drive;
for my $letter ('g' .. 'z' ) {
    my $mapped;
    $drive = "$letter:";
    GetUNCName( $mapped, $drive );
    last if not $mapped;
}

my $share = {
    RemoteName => SHARE_NAME,
    LocalName  => $drive,
};

print "connecting $share->{RemoteName} to $share->{LocalName}\n";
if( not AddConnection( $share, PASSWORD, USER_NAME, 0 )) {
    die "connection error:\n", win32err();
}

for my $file( @ARGV ) {
    print "copying $file\n";
    CopyFile( $file, "$share->{LocalName}$file", 0 )
        or print "\tfailed: " . fileLastError() . "\n";
}

if( not CancelConnection( $share->{LocalName}, 0, 1 )) {
    print "disconnection error:\n", win32err();
}

sub win32err {
    my $err;
    # Win32::GetError($err); -- bug spotted by puploki
    Win32::NetResource::GetError($err);
    Win32::FormatMessage($err);
}


作者: astraydog   发布时间: 2011-11-24

挺好!

作者: fibbery   发布时间: 2011-11-24