【问题标题】:Powershell - disable parts of Open File Dialog BoxPowershell - 禁用打开文件对话框的部分内容
【发布时间】:2013-07-19 09:58:53
【问题描述】:

是否可以禁用打开文件对话框窗口的某些部分,例如创建新文件夹按钮?

我正在使用的代码示例(取自http://blogs.technet.com/b/heyscriptingguy/archive/2009/09/01/hey-scripting-guy-september-1.aspx)是:

Function Get-FileName($initialDirectory)
{   
 [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
 Out-Null

 $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
 $OpenFileDialog.initialDirectory = $initialDirectory
 $OpenFileDialog.filter = "All files (*.*)| *.*"
 $OpenFileDialog.ShowDialog() | Out-Null
 $OpenFileDialog.filename
} #end function Get-FileName

Get-FileName -initialDirectory "c:\fso"

谢谢

【问题讨论】:

  • 我的系统刚刚没有运行所以无法测试,但是查看 MSDN 参考,我不这么认为,除了控制呼叫的安全性 - 如果用户不是' t 有足够的权限来创建文件夹,它可能足够聪明地隐藏或灰显New Folder 按钮。
  • 由于您使用的是 .NET 类,因此这实际上更像是一个 .NET 问题而不是 PowerShell 问题。您可以尝试寻找如何在 C# 或 VB.NET 中执行此操作;如果你找到任何东西,那么你只需要翻译它。
  • 谢谢大家。我想我会将安全性和权限视为限制这一点的一种方式。
  • 根据我的测试(你让我感兴趣!)我可以设置一个访问规则来禁止当前用户(运行脚本的用户)创建目录。但它并没有隐藏New Folder 按钮——相反,您会收到一个提示,告诉您Destination Folder Access Denied。不是你想要的,但如果你想要代码,我会放上去的。
  • 谢谢 Graham,想看代码!

标签: .net powershell


【解决方案1】:

好的,根据 cmets,此修改后的脚本版本会在对话框处于活动状态时禁用在目标目录中创建文件夹的访问权限,然后在函数完成之前删除最后的块:

    Function Get-FileName($initialDirectory)
{   
 <#DENY CreateDirectories privilege
  to currently logged on security principal#>

 $acl = get-acl $initialDirectory

 $right = "CreateDirectories"

 $principal = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name

 $denyrule = New-Object System.Security.AccessControl.FileSystemAccessRule($principal,$right,"DENY")

 $acl.AddAccessRule($denyrule)

 set-acl $initialDirectory $acl

 [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
 Out-Null

 $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
 $OpenFileDialog.initialDirectory = $initialDirectory
 $OpenFileDialog.filter = "All files (*.*)| *.*"
 $OpenFileDialog.ReadOnlyChecked = $true
 $OpenFileDialog.ShowDialog() | Out-Null
 $OpenFileDialog.filename

 #remove block now
 $acl.RemoveAccessRule($denyrule)

 set-acl $initialDirectory $acl

} #end function Get-FileName


Get-FileName -initialDirectory "c:\fso"

【讨论】:

  • 我很高兴,因为注册表路由失败了。暂时忽略在powershell中处理注册表权限比应该做的工作要多得多,我发现的键在删除值时会从Windows资源管理器中隐藏New Folder按钮,而不是OpenFileDialog。有一个 ShowNewFolderButton 布尔值用于控制该按钮的显示,但仅适用于 FolderBrowserDialog,这对您没有用处!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多