in reply to Re^3: Windows single sign-on / NTLM question
in thread Windows single sign-on / NTLM question

As a follow-up, in case any other sad sad person wants to do something silly like me.... It appears that the least clunky, but still not 100% Perl solution is to use PowerShell to grab the file. This works for my situation because most of the desktops have PowerShell installed as part of my company's default image and for those who don't, it's approved software on our internal Software Center. In any event, the relevant PS code snip is:

Invoke-WebRequest -Uri $REMOTE -OutFile $LOCAL -UseDefaultCredentials

Specifically, that "UseDefaultCredentials" will tell PS to throw your windows login info to the server. I've not actually integrated into my scripts, but as a proof of concept, it works.

Replies are listed 'Best First'.
Re^5: Windows single sign-on / NTLM question
by haukex (Archbishop) on Jan 23, 2019 at 19:48 UTC

    Thanks for the update! Sometimes calling the native tools turns out to be the "easiest" way to go, in cases like that I usually make sure the interface is as clean as possible.

    I've not actually integrated into my scripts, but as a proof of concept, it works.

    A quick test shows me that something like this seems to work:

    use IPC::Run3 'run3'; run3 ['powershell', '-Command', 'Invoke-WebRequest', '-Uri', $uri, '-OutFile', $filename, '-UseDefaultCredentials']; $? and die "run3 failed with \$?=$?";

    (I'm using IPC::Run3 because newer versions use Win32::ShellQuote under the hood, and it allows redirection of STDIN/OUT/ERR if desired. For really complicated cases, I guess PowerShell's -EncodedCommand is probably the way to go.)

    Update: Wrapped up in a function:

    use File::Temp qw/tempfile/; use IPC::Run3 'run3'; sub invoke_webrequest { my $uri = shift; my ($tfh,$tfn) = tempfile(UNLINK=>1); close $tfh; run3 ['powershell', '-Command', 'Invoke-WebRequest', '-Uri', $uri, '-OutFile', $tfn, '-UseDefaultCredentials']; $? and die "run3 failed with \$?=$?"; open my $fh, '<', $tfn or die "$tfn: $!"; my $data = do { local $/; <$fh> }; close $fh; unlink $tfn; return $data; }