有可能在这个create net share函数中改进GetEnumerator()迭代器吗?

时间:2014-02-25 12:02:02

标签: powershell powershell-v3.0 smb

我在PowerShell中创建了一个SmartCreateShare功能。目标是创建SMB共享,​​删除任何以前具有相同名称的现有共享。我正在使用PowerShell 3.0在Windows 2008 R2中执行此脚本,因此我使用 net share 命令。  这是函数

function SmartCreateShare($folder, $shareName, $shareUser, $sharePermissions)
{
    #Detect previous Share
    $shares = net share
    Foreach ($Key in ($shares.GetEnumerator() ))
    {
        #Write-host $Key
        if ($Key.Contains($shareName)) 
        { 
            NET SHARE $shareName /DELETE | Out-Null
            Write-host "Deleted share $shareName"
        }
    }

    # Create Share
    NET SHARE $shareName=$folder "/GRANT:$shareUser,READ" | Out-Null
    Write-host "Shared $folder with sharename: $shareName"

}

调用是

SmartCreateShare $baseBackupFolder "IddnBackups" "Everyone" "READ"

脚本工作正常,但我认为我迭代“Net Share”命令输出的方式并不是最好的。

是否可以改进脚本以使用Where-Object或类似内容而不是使用枚举器进行迭代?

2 个答案:

答案 0 :(得分:1)

Net Share只返回一个字符串数组。你可以替换这个:

Foreach ($Key in ($shares.GetEnumerator() ))
    {
      #Write-host $Key
      if ($Key.Contains($shareName)) 
      { 
        NET SHARE $shareName /DELETE | Out-Null
        Write-host "Deleted share $shareName"
      }
    }

有这样的事情:

if ((net share) -match "^$shareName\s")
  {
    NET SHARE $shareName /DELETE | Out-Null
    Write-host "Deleted share $shareName"
  }

答案 1 :(得分:1)

我建议使用WMI而不是使用net share(从here无耻地窃取的共享创建代码):

function SmartCreateShare($folder, $shareName, $shareUser, $sharePermissions) {
  $permissions = @{
    'read'   = 117978
    'change' = 1245631
    'full'   = 2032127
  }

  # delete existing share
  gwmi Win32_Share -Filter "Name = '$shareName'" | % { $_.Delete() } | Out-Null

  $trustee = ([wmiclass]'Win32_Trustee').PSBase.CreateInstance()
  $trustee.Domain = 'domain'
  $trustee.Name   = $shareUser

  $ace = ([wmiclass]'Win32_Ace').PSBase.CreateInstance()
  $ace.AccessMask = $permissions[$sharePermissions]
  $ace.AceFlags   = 3
  $ace.AceType    = 0
  $ace.Trustee    = $trustee

  $sd = ([wmiclass]'Win32_SecurityDescriptor').PSBase.CreateInstance()
  $sd.ControlFlags = 4
  $sd.DACL  = $ace
  $sd.group = $trustee
  $sd.owner = $trustee

  # re-create share
  (gwmi Win32_Share).Create($folder, $shareName, 0, 100, '', '', $sd)
}