Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell作为管理员登录脚本_Powershell_Active Directory_Gpo - Fatal编程技术网

PowerShell作为管理员登录脚本

PowerShell作为管理员登录脚本,powershell,active-directory,gpo,Powershell,Active Directory,Gpo,我有一个PowerShell脚本,需要在用户登录时运行。 该脚本使用AD模块查看用户是否属于某个组,并获取其他信息,此外,我还获取局部变量,如: $env:DOMAINNAME $env:USERNAME $env:APPDATA $env:TEMP 这就是为什么我需要它在登录时运行,但我认为这是一个权限问题 你知道我该怎么做吗?我尝试在用户配置下添加脚本→ 政策→ Windows设置→ 剧本→ 登录,但它不工作,也尝试在计算机配置下 添加了-ExecutionPolicy Bypass作为参

我有一个PowerShell脚本,需要在用户登录时运行。 该脚本使用AD模块查看用户是否属于某个组,并获取其他信息,此外,我还获取局部变量,如:

$env:DOMAINNAME
$env:USERNAME
$env:APPDATA
$env:TEMP
这就是为什么我需要它在登录时运行,但我认为这是一个权限问题

你知道我该怎么做吗?我尝试在用户配置下添加脚本→ 政策→ Windows设置→ 剧本→ 登录,但它不工作,也尝试在计算机配置下

添加了
-ExecutionPolicy Bypass
作为参数,但仍然为空


我还尝试将is作为计划任务添加,并作为其他用户运行,但仍然没有成功。

由于您在其他注释中共享了您的代码,我可以对您试图实现的目标做出一些假设,并提供帮助。让我们把它分解一下

ActiveDirectory模块 我们需要做的第一件事是删除对ActiveDirectory模块的依赖关系。正如这里的一些评论所解释的,ActiveDirectory模块是RSAT套件的内置组件。当此脚本在您的客户端计算机上运行时,它将不可用,我们不希望使其可用,因为它会产生大量依赖项开销,并向您的用户公开管理实用程序

您正在使用的cmdlet只是
Get ADUser
Get ADGroup
Get ADPrincipalGroupMembership
。这些是使用轻量级目录访问协议(LDAP)的搜索cmdlet,因此我们可以使用.NET类用自己的搜索函数替换它们

奉承 我们可以将
Get-ADUser
search cmdlet替换为我们自己在运行时定义的函数,如下所示:

function Get-ADUser 
{
    Param ( [string]$Identity = $null )
    IF ($Identity)
    {

        $UserSearcher = New-Object DirectoryServices.DirectorySearcher
        $UserSearcher.SearchRoot = "LDAP://$("DC=$(($ENV:USERDNSDOMAIN).Replace(".",",DC="))")"
        $UserSearcher.Filter = "(&(objectCategory=person)(SAMAccountName=$Identity))"
    
        $UserSearcher.FindAll() | foreach {New-Object PSObject -Property:$_.Properties}
    }
}
获得广告群 我们还需要替换
Get-ADGroup
cmdlet,以便能够获取您在
$OfficeLocations
列表中指定的广告组

function Get-ADGroup 
{
    Param ( [string]$Identity = $null )
    IF ($Identity)
    {

        $GroupSearcher = New-Object DirectoryServices.DirectorySearcher
        $GroupSearcher.SearchRoot = "LDAP://$("DC=$(($ENV:USERDNSDOMAIN).Replace(".",",DC="))")"
        $GroupSearcher.Filter = "(&(objectCategory=group)(SAMAccountName=$Identity))"
               
        $GroupSearcher.FindAll() | foreach {New-Object PSObject -Property:$_.Properties}
    }
}
获取ADPrincipalGroupMembership 不需要替换此cmdlet—不是因为它可以自己工作,而是因为您不需要它来实现所需的最终结果。您已使用它从广告用户检索组成员身份,但是广告用户将其成员身份列表附加到其广告用户对象。因此,本质上,我们可以直接从广告用户对象获取广告用户的成员资格列表,我们将这样做:

$userObject = Get-ADUser -Identity $env:USERNAME
$objGroup = $userObject.memberOf
此时您将注意到,结果集不是组名,而是它们的可分辨名称。这也是那些可分辨名称的字符串数组,您必须对代码中过滤此组列表的其余比较运算符进行一些修改

部署代码 我们需要了解的第二件事是如何部署此代码。有很多方法可以实现这一点,但我们假设您能够将脚本部署到最终用户并假设它运行

上下文 用于部署此代码的方法需要与代码本身保持一致。如果您的脚本对其运行的上下文进行了假设(例如使用
$env:USERNAME
为AD收集用户的SAMAccountName),那么您需要确保部署方法也进行了此假设。现在的脚本正在做出这样的假设——假设是用户自己的上下文运行此代码

为了支持这个假设,我们需要确保部署方法将以用户身份运行脚本

依赖关系 现在我们知道代码是作为用户在用户机器上自己的上下文中运行的,并且我们知道代码访问外部资源,例如Active Directory,我们需要确保用户拥有代码拥有的这些依赖项的权限,以确保代码能够工作

确保仔细阅读代码并列出代码执行的所有任务。我的意思是,代码将读取用户自己的AD对象,它将读取网络位置以访问签名文件,它将读取并写入用户自己的注册表,以及写入用户的appdata路径

总之
通过验证这些依赖关系,并使用与代码对齐的部署方法,您应该拥有一个可以工作的产品。您的代码表明,关于Powershell,您需要了解很多内容,但如果您坚持下去,并磨练您对基本原理的理解,您会没事的。不断学习,不断突破,并始终记住在过程中保持乐趣。

为什么您需要以其他用户的身份运行启动脚本?以具有更高权限的帐户的身份运行它。如果您要这样做,您也可以将其作为系统帐户运行。如果要在客户端计算机上使用
ActiveDirectory
PowerShell模块,必须先下载并安装远程服务器管理工具(RSAT),然后才能在“程序和功能”下启用该模块。在服务器系统上,RSAT已经存在,但您仍需要在服务器管理器中启用该模块(通过添加角色和功能)。您只能使用.NET类访问AD,但必须重新设计代码。非常感谢您的回复和对该问题的帮助!这是我现在要开始研究的东西,但有了它,我可以看到光明。正如您在我的脚本中所注意到的,我对powershell没有太多的经验,因为我最近开始学习,这是我在so fa中完成的最大的项目。我没有调用.NET类的经验,但这肯定让我知道从这里到哪里去完成脚本。我将致力于此,并为所有帮助我了解情况的人发布结果。非常感谢。