隐藏用户的导出PowerShell功能

时间:2017-01-30 13:49:29

标签: powershell module restrict

所以这个标题非常清楚,但无论如何我会问更精确。 所以问题是,是否可以从模块中导出辅助函数并使它们仅在代码中重用,但仅限于用户,因此他无法从控制台调用它们?

提前谢谢!

3 个答案:

答案 0 :(得分:0)

当然,您只需指定要导出的内容(在psm文件中):

Export-ModuleMember  -Function Verb-Noun

那只会导出这个函数并在你的psd文件中输出:

FunctionsToExport = 'Verb-Noun'

答案 1 :(得分:0)

我不认为这可能是你想要的方式。我如何处理它是在helper模块中有一个包含所有隐藏命令的PS1文件,但不将其作为辅助模块的一部分加载。然后在依赖它的模块中,只需点源PS1辅助文件,它就会导入所有脚本供它使用。

例如,在需要帮助模块的模块中:

. $PSScriptRoot\..\HelperModule\HelperModuleInternal.ps1

显然,将HelperModule和HelperModuleInternal分别替换为辅助模块的名称和隐藏的命令ps1文件。请注意,如果您将其设为psm1文件,则只会打开ISE。

我不确定但它仍然可能会尝试导出隐藏的命令,如果是这种情况,我会在处理它时阅读一个巧妙的技巧。以通常的Verb-Noun语法调用所有已发布的命令,最后放置Export-ModuleMember -Function "*-*"。然后,对于内部命令,请使用不符合此命名的命名,例如Verb_NounVerbNoun。非常整洁。

答案 2 :(得分:0)

我发现了两种实现所需目标的方法,但都不干净或直观。我认为问题是由$Env:PSModulePath目录中任何模块的自动加载引起的。这是对我有用的方法,您可以选择毒药。

选项1:关闭模块自动加载

  • 在父模块清单中,将帮助程序模块的名称添加为嵌套模块: NestedModules = @('MyHelperModule')
  • 在个人资料中,将$PSModuleAutoloadingPreference设置为'None''ModuleQualified'。这将防止您的帮助程序模块自动加载,并因此暴露给用户。不幸的是,这也会阻止所有其他模块自动加载,这意味着您还必须在配置文件中添加Import-Module语句,以便在每次会话开始时显式加载您想要的模块,并手动进行导入任何其他内容。根据您的工作方式,这可能会带来更多的麻烦。

选项2:移动帮助程序模块

  • 将帮助程序模块移到$Env:PSModulePath列表之外的目录中,例如C:\ MyHiddenModules \ MyHelperModule。
  • 在父模块清单中,将帮助程序模块的完整路径添加为嵌套模块: NestedModules = @('C:\MyHiddenModules\MyHelperModule\MyHelperModule.psm1')

在这两种情况下,都可以使用父清单中的FunctionsToExport数组来控制要向用户公开的辅助功能(如果有)。

$PSModuleAutoloadingPreference首选项变量的详细信息。