【问题标题】:Alternate for loading active directory module in powershell在 powershell 中加载活动目录模块的替代方法
【发布时间】:2016-08-01 15:41:21
【问题描述】:

我在一家公司担任 IT 人员。用户在休假期间忘记更改密码,我们的密码有效期为 90 天,由于我们公司的政策,用户在休假期间不能更改密码。

我创建了一个 power shell 脚本来导入活动目录模块并检查他们的密码最后设置日期,我将 powershell 脚本转换为 exe。

当用户从他们的 PC 运行 exe 文件时,它会显示一个错误,无法加载活动目录模块。

现在我上网查了一下,论坛建议在 PC 上安装远程服务器管理工​​具,并从 windows 功能打开 AD DS 和 AD LDS 工具。两者都需要管理权限,我们无法在每个标准用户的 PC 上执行此操作。

是否有任何巧妙的方法来运行此文件,而无需在每台 PC 上安装 RSAT?有什么方法可以修改脚本,使其在所有标准用户 PC 上运行而无需任何类型的管理帐户?谢谢

【问题讨论】:

  • 用户遇到什么错误?由于缺少实际模块而无法加载?我建议您将 Powershell 模块放在可供用户使用的网络共享上。 (如 sysvol 或本地文件服务器并从那里加载)。
  • 你有任何脚本来提醒密码将在 X 天后过期 90 天很好,我很震惊用户休假多长时间
  • 用户登录域?如果是,为什么需要在每台计算机上运行脚本?什么脚本?
  • @AgentK 错误是“无法加载活动目录模块”嗯。如何将powershell模块放入共享并从那里调用?对不起,我是这方面的新手。
  • @Deptor 用户看到密码过期的通知并忽略,当他们休假时,他们打电话给我们并抱怨他们无法收到任何电子邮件。所以我设计了这个,让用户的秘书检查并通知用户修改密码。

标签: powershell


【解决方案1】:

您不需要 RSAT。 ADSI 将满足您的需求:

$Days = 20
$User = [ADSI]"WinNT://$env:USERDNSDOMAIN/$env:USERNAME,user"
$Flags = $User.UserFlags.psbase.Value
# Check if password does not expire bit is set.
If ($Flags -band 65536)
{
  "Password does not expire"
}
Else
{
  # Convert from seconds to days.
  $AgeDays = $User.PasswordAge.psbase.Value / 86400
  $MaxAge = $User.MaxPasswordAge.psbase.Value / 86400
  If ($AgeDays -gt $MaxAge)
  {
    "Password Expired"
  }
  Else
  {
    If (($AgeDays + $Days) -gt $MaxAge)
    {
      "Password will expire within $Days days"
    }
    Else
    {
      "Password is not about to expire"
    }
  }
}

【讨论】:

  • 谢谢你让我试试。
【解决方案2】:

我会做这样的事情

将此脚本保存为 passwordenquiry.vsb 并将其放置在共享文件夹中,并通过 GPO 将桌面快捷方式作为 PasswordEnquiry.vbs 链接到它,这样当他们单击它时,他们会在输入密码时收到通知即将过期并告诉他们在离开脚本消息之前更改它。

Dim oDomain
Dim oUser
Dim maxPwdAge
Dim numDays
Dim warningDays
warningDays = 11

Set LoginInfo = CreateObject("ADSystemInfo") 
Set objUser = GetObject("LDAP://" & LoginInfo.UserName & "") 
strDomainDN = UCase(LoginInfo.DomainDNSName) 
strUserDN = LoginInfo.UserName

Set oDomain = GetObject("LDAP://" & strDomainDN)
Set maxPwdAge = oDomain.Get("maxPwdAge")
'========================================
' Calculate the number of days that are
' held in this value.
'========================================
numDays = CCur((maxPwdAge.HighPart * 2 ^ 32) + _
maxPwdAge.LowPart) / CCur(-864000000000)
'WScript.Echo "Maximum Password Age: " & numDays

'========================================
' Determine the last time that the user
' changed his or her password.
'========================================
Set oUser = GetObject("LDAP://" & strUserDN)
'========================================
' Add the number of days to the last time
' the password was set.
'========================================
whenPasswordExpires = DateAdd("d", numDays, oUser.PasswordLastChanged)
fromDate = Date
daysLeft = DateDiff("d",fromDate,whenPasswordExpires)

'WScript.Echo "Password Last Changed: " & oUser.PasswordLastChanged
if (daysLeft < warningDays) and (daysLeft > -1) then
Msgbox "Password Expires in " & daysLeft & " day(s)" & " at " & whenPasswordExpires & chr(13) & chr(13) & "Change it before you go for leave" & chr(13) & "Press CTRL+ALT+DEL and select the 'Change a password' option", 0, "PASSWORD EXPIRATION WARNING!"
End if
'========================================
' Clean up.
'========================================
Set oUser = Nothing
Set maxPwdAge = Nothing
Set oDomain = Nothing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多