Powershell:如何使用不同的用户名/密码映射网络驱动器

Posted

技术标签:

【中文标题】Powershell:如何使用不同的用户名/密码映射网络驱动器【英文标题】:Powershell: how to map a network drive with a different username/password 【发布时间】:2010-12-04 13:59:06 【问题描述】:

背景:假设我使用本地机器上的以下 powershell 脚本来自动映射一些网络驱动器。

$net = $(New-Object -ComObject WScript.Network);
$net.MapNetworkDrive("p:", "\\papabox\files");

$net = $(New-Object -ComObject WScript.Network);
$net.MapNetworkDrive("q:", "\\quebecbox\files");

## problem -- this one does not work because my username/password
## is different on romeobox
$net = $(New-Object -ComObject WScript.Network);
$net.MapNetworkDrive("r:", "\\romeobox\files");

问题:如何修改脚本以便我也可以连接到 romeobox,即使我在 romeobox 上的用户名/密码与其他两个盒子的用户名/密码不同?

【问题讨论】:

【参考方案1】:
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive("r:", "\\romeobox\files", $false, "domain\user", "password")

应该做的伎俩,

善良,

【讨论】:

出于好奇,$false 的目的是什么,大概是返回值吧?查了一下,但找不到 MapNetworkDrive 的文档... 来自文档persistent: True/False - store the mapping persistently in the users profile. default = false【参考方案2】:

如果您需要一种方法来存储密码而不将其以纯文本形式放在脚本或数据文件中,您可以使用 DPAPI 保护密码,以便您可以将其安全地存储在文件中,并在以后以纯文本形式检索文本例如:

# Stick password into DPAPI storage once - accessible only by current user
Add-Type -assembly System.Security
$passwordBytes = [System.Text.Encoding]::Unicode.GetBytes("Open Sesame")
$entropy = [byte[]](1,2,3,4,5)
$encrytpedData = [System.Security.Cryptography.ProtectedData]::Protect( `
                       $passwordBytes, $entropy, 'CurrentUser')
$encrytpedData | Set-Content -enc byte .\password.bin

# Retrieve and decrypted password
$encrytpedData = Get-Content -enc byte .\password.bin
$unencrytpedData = [System.Security.Cryptography.ProtectedData]::Unprotect( `
                       $encrytpedData, $entropy, 'CurrentUser')
$password = [System.Text.Encoding]::Unicode.GetString($unencrytpedData)
$password

【讨论】:

【参考方案3】:

来这里寻找如何使用 PowerShell 映射驱动器?

PowerShell3.0 有一个更简单的方法。 New-PSDrive 已更新为 -persist 选项。例如。

New-PSDrive -Name U -PSProvider FileSystem -Root \\yourserver\your\folder -Credential yourdomain\username -Persist

过去,New-PSDrive 仅影响当前的 PowerShell 会话。 -persist 导致映射向 O/S 注册,就像它一样。见New-PSDrive

要回答原始问题,您可以更改使用的凭据。使用-Credential 更改域\用户名会导致 Windows 提示输入密码。另一种选择是传递一个 PSCredential 对象,如下例所示。详情请参阅Get-Credential。

PS C:\> $User = "mydomain\username"
PS C:\> $PWord = ConvertTo-SecureString -String "mypassword" -AsPlainText -Force
PS C:\> $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord
PS C:\> New-PSDrive -Name U -PSProvider FileSystem -Root \\domain\some\folder -Credential $Credential -Persist  

【讨论】:

我认为现在可能有更简单的方法来获取凭据:$Credential = Get-Credential -Credential "domain\user"。这将提示输入已填充用户名字段的密码。【参考方案4】:

我发现在我的案例中这种简单的衬线工作(有点“开箱即用”的想法;))

(Start-Process -FilePath "C:\windows\system32\NET.exe" -ArgumentList "USE I: \Server\Volume /USER:XXXXX password /persistent:yes" -Wait -Passthru).ExitCode

作为额外的奖励,您可以获得一个不错的退出代码来报告。希望对您有所帮助。

【讨论】:

【参考方案5】:
$User = "user"
$PWord = ConvertTo-SecureString -String "password" -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord
$net = $(New-Object -ComObject WScript.Network)
$net.MapNetworkDrive("r:", "\\server\share")

【讨论】:

【参考方案6】:

如果你设置使用powershell native(如果有这样的事情),那么你可以使用:

 New-SMBMapping -LocalPath "V:" -RemotePath $NetworkPath -UserName $UserAndDomain -Password $pass 

见:https://docs.microsoft.com/en-us/powershell/module/smbshare/new-smbmapping?view=win10-ps

还有一些额外的掘金,例如 Remove-SMBMapping 等。

【讨论】:

以上是关于Powershell:如何使用不同的用户名/密码映射网络驱动器的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell AD用户密码过期脚本更新版

使用 PowerShell 问题重置 AD 用户密码

如何使用PowerShell中的当前Windows用户的凭据加密KeePass?

如何根据 clientid 和客户端密码在 Runbook 中运行 powershell 脚本

在Powershell中跨不同系统加密密码

powershell 使用安全/加密字符串使用用户名/密码创建PowerShell PSCredential对象。