2013-07-18 2 views
1

Можно ли отключить части диалогового окна открытого файла, например кнопку создания новой папки?Powershell - отключить части диалогового окна Open File

Пример кода я использую (из 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" 

Благодаря

+0

Моя система не работает только сейчас, поэтому не может проверить, но ищет на ссылке MSDN, я так не думаю, кроме управления безопасностью вызова - если пользователь недостаточно привилегирован для создания папки, он может быть достаточно умен, чтобы скрывать или серовать кнопку «Новая папка» , –

+2

Поскольку вы используете .NET-класс, это скорее вопрос .NET, чем один PowerShell. Вы можете попытаться найти, как это сделать на C# или VB.NET; если вы найдете что-нибудь, тогда вам просто нужно его перевести. – jpmc26

+0

Спасибо всем. Я думаю, что я буду рассматривать безопасность и разрешения как способ ограничить это. –

ответ

0

OK, в комментариях, это модифицированная версия вашего сценария запрещает доступ к созданию папки в целевой каталог, в то время как диалог активен, а затем удаляет блок в конце перед выполнением функции:

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" 
+0

Это замечательно, спасибо Грэм! –

+0

Я рад, потому что маршрут реестра - это бюст. Игнорируя на мгновение, что гораздо больше усилий для решения разрешений реестра в powershell, чем это должно быть, ключ, который я нашел, когда значение удаляется, скрывает кнопку «Новая папка» из проводника Windows, но не из 'OpenFileDialog'. Для управления отображением этой кнопки существует логическое значение «ShowNewFolderButton», но только для «FolderBrowserDialog», которое вам бесполезно! –