Perl Opendir с логином?

В настоящее время у меня есть одна функция, чтобы скопировать некоторые файлы с сетевого диска и вставить их в папку моего локального сервера.

sub getNetworkDrive {
    #my $dir="\\\\network\\Path";
    my ($dir, $move_to) = @_;

    opendir(DIR, $dir) or die "can't opendir $dir: $! \n";

    my @files=readdir(DIR);
    closedir DIR;

    foreach my $file (@files) 
    {
        if (-f "$dir$file") 
        {  
            #my $move_to="C:\\Projects\\Perl\\download\\$file";
            my $move_from = "$dir$file";
            copy($move_from, $move_to) or die "Copy Failed: $!";
            print "File: $file : has been downloaded Successfully\n";
        }
    }
}

Он отлично работает, когда я использую своего пользователя для выполнения сценария, потому что у моего пользователя есть доступ к сетевому диску.

Я хотел бы, чтобы этот сценарий запрашивал авторизованное имя пользователя и пароль при каждом запуске сценария.

Так Opendir принимает имя пользователя и пароль в качестве параметра? если нет, то какова моя альтернатива?


person Jerry Lam    schedule 14.10.2013    source источник
comment
stackoverflow.com/questions/8972171/   -  person mpapec    schedule 14.10.2013


Ответы (1)


Благодаря mpapec

Я добавил для этого новую функцию, и теперь она работает

use Win32::NetResource qw/GetUNCName AddConnection CancelConnection/;
use Win32API::File qw/ CopyFile fileLastError /;
sub getNetworkDrive {
    my ($share_name, $user_name, $password) = @_;

    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";
    }

    getNetworkDriveWithoutLogin($share->{LocalName}, "C:\\Projects\\Perl\\download\\");

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