如何使用powershell 5检查网络文件夹是否存在凭据

时间:2017-04-24 04:31:39

标签: windows powershell powershell-v5.0

请说有一个网络文件夹\\my_server\my_root\my_dir。 要访问此文件夹,这些凭据需要用户名:my_doman\my_user密码:my_password

现在我的程序首先尝试将网络文件夹映射到本地驱动器。如果存在异常,则认为文件夹不存在。我认为这不是一个好方法。

有没有办法检查此文件夹是否存在而不尝试映射到本地驱动器?我正在寻找像

这样的东西

[System.IO.Path]::Exist("\\my_server\my_root\my_dir","my_doman\my_user","my_password")

我正在使用Powershell 5

这就是我现在映射驱动器的方式

try{
    $net = new-object -ComObject WScript.Network
    $net.MapNetworkDrive($free_drive, $network_dir, $false, "domain\user", "password")
}catch{
  Write-host: "folder does not exist"
}

3 个答案:

答案 0 :(得分:1)

使用New-PSDrive

New-PSDrive -Name Q -PSProvider FileSystem -Root \\my_server\my_root\my_dir -Credential my_domain\my_user -Persist

使用cmdline实用程序的Old School方法:

net use \\my_server\my_root\my_dir /user:my_domain\my_user my_password
start \\my_server\my_root\my_dir

对于映射,您可以使用:

$net = New-Object -comobject Wscript.Network
$net.MapNetworkDrive("Q:","\\my_server\my_root\my_dir",0,"my_domain\my_user","my_password")

要测试路径,您可以使用:

Test-Path \\my_server\my_root\my_dir

注意:您将从测试路径返回一个布尔值。

希望它有所帮助。

答案 1 :(得分:0)

假设在执行脚本的计算机上您能够以您想要连接到远程共享的用户身份登录,您可以使用Invoke-Command来调用Test-Path as另一个用户:

$pathExists = Invoke-Command -ComputerName . -Credential $credentials -ScriptBlock {
    Test-Path -Path "\\my_server\my_root\my_dir"
}
if ($pathExists)
{
    # my_dir\ exists
}
else
{
    # my_dir\ is inaccessible/non-existent
}

我目前无法对此进行测试,但我怀疑您可能需要将-Authentication Credssp作为参数添加到Invoke-Command(假设有必要的环境)由于双跳问题。

当然,如果您在另一个用户下检查该目录是否存在,以便为将来的文件系统操作作为同一用户执行决策,那么您需要Invoke-Command另一个用户批量操作或在Test-Path之后包含它们。此时,您可能最好以常规方式在备用凭据下连接到共享。它只是执行作为另一个用户和连接作为另一个用户之间的区别,每个用户各有利弊。

答案 2 :(得分:0)

从部署服务器复制文件之前,我在检查远程服务器上的文件夹和/或文件是否存在相同的问题。什么都没有为我工作,最终陷入极大的挫败感。

然后我尝试了这个...

// Audio Queue callback function, called when an input buffer has been filled.
static void MyAQInputCallback(void *inUserData, AudioQueueRef inQueue,
                              AudioQueueBufferRef inBuffer,
                              const AudioTimeStamp *inStartTime,
                              UInt32 inNumPackets,
                              const AudioStreamPacketDescription *inPacketDesc)
{
    MyRecorder *recorder = (MyRecorder *)inUserData;

    // if inNumPackets is greater then zero, our buffer contains audio data
    // in the format we specified (AAC)
    if (inNumPackets > 0)
    {
        // write packets to file
        CheckError(AudioFileWritePackets(recorder->recordFile, FALSE, inBuffer->mAudioDataByteSize,
                                         inPacketDesc, recorder->recordPacket, &inNumPackets,
                                         inBuffer->mAudioData), "AudioFileWritePackets failed");
        // increment packet index
        recorder->recordPacket += inNumPackets;
    }

    // if we're not stopping, re-enqueue the buffer so that it gets filled again
    if (recorder->running)
        CheckError(AudioQueueEnqueueBuffer(inQueue, inBuffer,
                                           0, NULL), "AudioQueueEnqueueBuffer failed");
}

在测试路径中使用绝对路径后,这对我来说效果很好。由于某些原因,UNC路径不起作用!希望这对某人有帮助!