我在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或类似内容而不是使用枚举器进行迭代?
答案 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)
}