【问题标题】:Create network share on machine outside domain在域外的机器上创建网络共享
【发布时间】:2014-09-17 15:19:34
【问题描述】:

问题:

通过.ps1 脚本在远程计算机(Win 2008 Server)上创建网络共享,并提供usernamepassword

这在当前用户有足够权限的情况下可以正常工作

$share = Get-WmiObject Win32_Share -List -ComputerName 10.0.0.1
$share.create("C:\dir","foo", 0)

targetServer 是我的用户没有足够权限的机器时,我需要一种方法来提供usernamepassword

【问题讨论】:

    标签: windows powershell networking


    【解决方案1】:

    Get-WmiObject 有一个参数-Credential,因此您可以使用Get-Credential 提示用户输入凭据并像这样传递它们:

    $cred  = Get-Credential
    $share = Get-WmiObject Win32_Share -List -Computer 10.0.0.1 -Credential $cred
    $share.Create('C:\dir', 'foo', 0)
    

    如果您想完全自动化凭证处理,您可以自己构建凭证对象:

    $username = 'DOMAIN\user'
    $password = 'password'
    
    $pw   = ConvertTo-SecureString $password -AsPlainText -Force
    $cred = New-Object Management.Automation.PSCredential $username, $pw
    
    $share = Get-WmiObject Win32_Share -List -Computer 10.0.0.1 -Credential $cred
    $share.Create('C:\dir', 'foo', 0)
    

    不过,在脚本中存储纯文本密码并不是一个好习惯,因此您可能希望将加密密码存储在单独的文件中(确保对该文件设置限制性权限):

    PS C:\> Read-Host 'Enter password' -AsSecureString |
    >> ConvertFrom-SecureString | Out-File 'C:\password.txt'
    >>
    Enter password: ******
    PS C:\> Get-Content 'C:\password.txt'
    01000000d08c9ddf0115d1118c7a00c04fc297eb01000000a04a09e406c93741865ab010ed072699
    0000000002000000000003660000c00000001000000028b14f21c501cdf629b94cea2837e8520000
    000004800000a0000000100000002db774b0a8612917224e7dbfd69055340800000043f449c82f47
    3e78140000007de59fcec57a1dc9b6b62272eff517b8bf5291e5

    然后可以像这样读取和解密加密的密码:

    $username = 'DOMAIN\user'
    
    $pw   = Get-Content 'C:\password.txt' | ConvertTo-SecureString
    $cred = New-Object Management.Automation.PSCredential $username, $pw
    
    $share = Get-WmiObject Win32_Share -List -Computer 10.0.0.1 -Credential $cred
    $share.Create('C:\dir', 'foo', 0)
    

    但是请注意,ConvertTo-SecureString 使用运行命令的用户(我认为是主机)对密码进行加密/解密。如果您需要以一个用户的身份加密密码并以另一个用户(或在另一台主机上)的身份对其进行解密,您必须在这些用户/主机之间共享一个密钥。可以像这样生成随机密钥:

    PS C:\> $numchars = 24   # 192 Bit
    PS C:\> $charmap = [char]'A'..[char]'Z' +
    >> [char]'a'..[char]'z' +
    >> [char]'0'..[char]'9'
    >>
    PS C:\> [char[]]($charmap | sort {Get-Random})[1..$numchars] -join ''
    b69cGXKpJaI5tLrj4lHEPN3e

    使用这样的共享密钥创建密码文件:

    PS C:\> $key = [char[]]($charmap | sort {Get-Random})[1..$numchars] -join ''
    PS C:\> $pw = Read-Host 'Enter password' -AsSecureString |
    >> ConvertFrom-SecureString -Key ([byte[]][char[]]$key)
    >>
    Enter password: ******
    PS C:\> @"
    >> Key  = $key
    >> Pass = $pw
    >> "@ | Out-File 'C:\password.txt'
    >>

    并像这样读取加密密码:

    $username = 'DOMAIN\user'
    
    $pass = Get-Content 'C:\password.txt' | Out-String | ConvertFrom-StringData
    $pw   = ConvertTo-SecureString $pass.Pass -Key ([byte[]][char[]]$pass.Key)
    $cred = New-Object Management.Automation.PSCredential $username, $pw
    
    $share = Get-WmiObject Win32_Share -List -Computer 10.0.0.1 -Credential $cred
    $share.Create('C:\dir', 'foo', 0)
    

    【讨论】:

    • 这是自动化过程的一部分,因此不需要用户输入。我看到用户可以指定 -Credential FABRIKAM\administrator ,有没有办法指定密码?
    猜你喜欢
    • 2016-07-03
    • 2017-11-30
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2017-09-21
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多