Verwalten von Benutzerkennwörtern
Dieses Thema enthält Informationen und Codebeispiele für die Verwaltung von Benutzerkennwörtern.
Im folgenden C#-Codebeispiel wird veranschaulicht, wie das Benutzerkennwort durch Aufrufen der IADsUser::SetPassword-Methode festgelegt wird. Weitere Informationen zu IADsUser::SetPassword finden Sie unter "IADsUser::SetPassword" in der MSDN Library unter https://go.microsoft.com/fwlink/?LinkID=27252.
usr.Invoke("SetPassword", SecurelyStoredPassword);
Im folgenden C#-Codebeispiel wird veranschaulicht, wie das Benutzerkennwort durch Aufrufen der IADsUser::ChangePassword-Methode geändert wird. Weitere Informationen zu IADsUser::ChangePassword finden Sie unter "IADsUser::ChangePassword" in der MSDN Library unter https://go.microsoft.com/fwlink/?LinkID=27252.
usr.Invoke("ChangePassword", OldSecurelyStoredPassword, NewSecurelyStoredPassword);
Im folgenden C#-Codebeispiel wird veranschaulicht, wie das Benutzerkennwort so eingerichtet wird, dass es bei der nächsten Anmeldung geändert werden muss. Dazu wird die pwdLastSet-Eigenschaft auf -1 festgelegt. Weitere Informationen zum pwdLastSet-Attribut des Active Directory-Schemas finden Sie unter "pwdLastSet" oder "Pwd-Last-Set attribute" in der MSDN Library unter https://go.microsoft.com/fwlink/?LinkID=27252.
usr.Properties["pwdLastSet"].Value = -1; // To turn on, set this value to 0.
usr.CommitChanges();
Im folgenden Visual Basic .NET-Codebeispiel wird eine Funktion veranschaulicht, die einen Zugriffssteuerungseintrag festlegt, der dem Benutzer das Recht verweigert, sein Kennwort zu ändern. Informationen zum Zugriff auf IADsSecurityDescriptor, um die ntSecurityDescriptor-Eigenschaft abzurufen, finden Sie unter Verwenden von COM-Interop für den Zugriff auf ADSI. Anschließend wird IADsAccessControlList zum Abrufen der freigegebenen Zugriffssteuerungsliste aus der Sicherheitsbeschreibung und IADsAccessControlEntry zum Abrufen der Eigenschaften AceType, AceFlags, Trustee, Flags, ObjectType und AccessMask verwendet. Die AceType-Flags sind in ADS_ACETYPE_ENUM definiert. Die AceFlags-Werte sind in ADS_FLAGTYPE_ENUM definiert. Die AccessMask-Flags sind in ADS_RIGHTS_ENUM definiert.
Imports System
Imports System.DirectoryServices
Imports ActiveDs
Shared Sub DenyChangePassword(User As DirectoryEntry)
Const PASSWORD_GUID As String = "{ab721a53-1e2f-11d0-9819-00aa0040529b}"
Dim trustees() As String = {"NT AUTHORITY\SELF", "EVERYONE"}
Dim sd As ActiveDs.IADsSecurityDescriptor = CType(User.Properties("ntSecurityDescriptor").Value,
ActiveDs.IADsSecurityDescriptor)
Dim acl As ActiveDs.IADsAccessControlList = CType(sd.DiscretionaryAcl,
ActiveDs.IADsAccessControlList)
Dim ace As New ActiveDs.AccessControlEntry()
Dim trustee As String
For Each trustee In trustees
ace.Trustee = trustee
ace.AceFlags = 0
ace.AceType = Fix(ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_DENIED_OBJECT)
ace.Flags = Fix(ActiveDs.ADS_FLAGTYPE_ENUM.ADS_FLAG_OBJECT_TYPE_PRESENT)
ace.ObjectType = PASSWORD_GUID
ace.AccessMask = Fix(ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_DS_CONTROL_ACCESS)
acl.AddAce(ace)
Next trustee
sd.DiscretionaryAcl = acl
User.Properties("ntSecurityDescriptor").Value = sd
User.CommitChanges()
End Sub 'DenyChangePassword
Im folgenden Visual Basic .NET-Beispiel wird eine Funktion veranschaulicht, die einen Zugriffssteuerungseintrag festlegt, der dem Benutzer das Recht verweigert, sein Kennwort zu ändern. In diesem Beispiel wird die verwaltete Funktionalität für Zugriffssteuerungslisten in .NET Framework 2.0 verwendet.
Imports System
Imports System.DirectoryServices
Imports System.Security.Principal
Imports System.Security.AccessControl
Sub DenyChangePassword(ByVal user As DirectoryEntry)
' Create a Guid that identifies the Change Password right.
Dim changePasswordGuid As New Guid("{AB721A53-1E2F-11D0-9819-00AA0040529B}")
' Get the ActiveDirectorySecurity for the user.
Dim userSecurity As ActiveDirectorySecurity = user.ObjectSecurity
' Create a SecurityIdentifier object for "everyone".
Dim everyoneSid As New SecurityIdentifier(WellKnownSidType.WorldSid, Nothing)
' Create a SecurityIdentifier object for "self".
Dim selfSid As New SecurityIdentifier(WellKnownSidType.SelfSid, Nothing)
' Create an access rule to allow everyone the change password
' right.
' This is used to remove any existing access rules.
Dim allowEveryone As New ActiveDirectoryAccessRule(everyoneSid, _
ActiveDirectoryRights.ExtendedRight, _
AccessControlType.Allow, _
changePasswordGuid)
' Create an access rule to deny everyone the change password right.
Dim denyEveryone As New ActiveDirectoryAccessRule(everyoneSid, _
ActiveDirectoryRights.ExtendedRight, _
AccessControlType.Deny, _
changePasswordGuid)
' Create an access rule to allow self the change password right.
' This is used to remove any existing access rules.
Dim allowSelf As New ActiveDirectoryAccessRule(selfSid, _
ActiveDirectoryRights.ExtendedRight, _
AccessControlType.Allow, _
changePasswordGuid)
' Create an access rule to deny self the change password right.
Dim denySelf As New ActiveDirectoryAccessRule(selfSid, _
ActiveDirectoryRights.ExtendedRight, _
AccessControlType.Deny, _
changePasswordGuid)
' Remove any existing rule that gives "everyone" the change
' password right.
userSecurity.RemoveAccessRuleSpecific(allowEveryone)
' Add a new access rule to deny "everyone" the change password
' right.
userSecurity.AddAccessRule(denyEveryone)
' Remove any existing rule that gives "self" the change password
' right.
userSecurity.RemoveAccessRuleSpecific(allowSelf)
' Add a new access rule to deny "self" the change password right.
userSecurity.AddAccessRule(denySelf)
' Commit the changes.
user.CommitChanges()
End Sub 'DenyChangePassword
Im folgenden C#-Codebeispiel wird eine Funktion veranschaulicht, die einen Zugriffssteuerungseintrag festlegt, der dem Benutzer das Recht verweigert, sein Kennwort zu ändern. Informationen zum Zugriff auf IADsSecurityDescriptor, um die ntSecurityDescriptor-Eigenschaft abzurufen, finden Sie unter Verwenden von COM-Interop für den Zugriff auf ADSI. Anschließend wird IADsAccessControlList zum Abrufen der freigegebenen Zugriffssteuerungsliste aus der Sicherheitsbeschreibung und IADsAccessControlEntry zum Abrufen der Eigenschaften AceType, AceFlags, Trustee, Flags, ObjectType und AccessMask verwendet. Die AceType-Flags sind in ADS_ACETYPE_ENUM definiert. Die AceFlags-Werte sind in ADS_FLAGTYPE_ENUM definiert. Die AccessMask-Flags sind in ADS_RIGHTS_ENUM definiert.
using System;
using System.DirectoryServices;
using ActiveDs;
static void DenyChangePassword(DirectoryEntry User)
{
const string PASSWORD_GUID = "{ab721a53-1e2f-11d0-9819-00aa0040529b}";
const int ADS_UF_PASSWORD_EXPIRED=0x800000;
const int ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION=0x1000000;
string[] trustees = new string[]{@"NT AUTHORITY\SELF","EVERYONE"};
ActiveDs.IADsSecurityDescriptor sd = (ActiveDs.IADsSecurityDescriptor)
User.Properties["ntSecurityDescriptor"].Value;
ActiveDs.IADsAccessControlList acl = (ActiveDs.IADsAccessControlList) sd.DiscretionaryAcl;
ActiveDs.IADsAccessControlEntry ace = new ActiveDs.AccessControlEntry();
foreach(string trustee in trustees)
{
ace.Trustee = trustee;
ace.AceFlags = 0;
ace.AceType = (int)ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_DENIED_OBJECT;
ace.Flags = (int)ActiveDs.ADS_FLAGTYPE_ENUM.ADS_FLAG_OBJECT_TYPE_PRESENT;
ace.ObjectType = PASSWORD_GUID;
ace.AccessMask = (int)ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_DS_CONTROL_ACCESS;
acl.AddAce(ace);
}
sd.DiscretionaryAcl = acl;
User.Properties["ntSecurityDescriptor"].Value = sd;
User.CommitChanges();
}
Im folgenden C#-Beispiel wird eine Funktion veranschaulicht, die einen Zugriffssteuerungseintrag festlegt, der dem Benutzer das Recht verweigert, sein Kennwort zu ändern. In diesem Beispiel wird die verwaltete Funktionalität für Zugriffssteuerungslisten in .NET Framework 2.0 verwendet.
using System;
using System.DirectoryServices;
using System.Security.Principal;
using System.Security.AccessControl;
static void DenyChangePassword(DirectoryEntry user)
{
// Create a Guid that identifies the Change Password right.
Guid changePasswordGuid =
new Guid("{AB721A53-1E2F-11D0-9819-00AA0040529B}");
// Get the ActiveDirectorySecurity for the user.
ActiveDirectorySecurity userSecurity = user.ObjectSecurity;
// Create a SecurityIdentifier object for "everyone".
SecurityIdentifier everyoneSid =
new SecurityIdentifier(WellKnownSidType.WorldSid, null);
// Create a SecurityIdentifier object for "self".
SecurityIdentifier selfSid =
new SecurityIdentifier(WellKnownSidType.SelfSid, null);
// Create an access rule to allow everyone the change password
// right.
// This is used to remove any existing access rules.
ActiveDirectoryAccessRule allowEveryone =
new ActiveDirectoryAccessRule(
everyoneSid,
ActiveDirectoryRights.ExtendedRight,
AccessControlType.Allow,
changePasswordGuid);
// Create an access rule to deny everyone the change password right.
ActiveDirectoryAccessRule denyEveryone =
new ActiveDirectoryAccessRule(
everyoneSid,
ActiveDirectoryRights.ExtendedRight,
AccessControlType.Deny,
changePasswordGuid);
// Create an access rule to allow self the change password right.
// This is used to remove any existing access rules.
ActiveDirectoryAccessRule allowSelf =
new ActiveDirectoryAccessRule(
selfSid,
ActiveDirectoryRights.ExtendedRight,
AccessControlType.Allow,
changePasswordGuid);
// Create an access rule to deny self the change password right.
ActiveDirectoryAccessRule denySelf =
new ActiveDirectoryAccessRule(
selfSid,
ActiveDirectoryRights.ExtendedRight,
AccessControlType.Deny,
changePasswordGuid);
// Remove any existing rule that gives "everyone" the change
// password right.
userSecurity.RemoveAccessRuleSpecific(allowEveryone);
// Add a new access rule to deny "everyone" the change password
// right.
userSecurity.AddAccessRule(denyEveryone);
// Remove any existing rule that gives "self" the change password
// right.
userSecurity.RemoveAccessRuleSpecific(allowSelf);
// Add a new access rule to deny "self" the change password right.
userSecurity.AddAccessRule(denySelf);
// Commit the changes.
user.CommitChanges();
}
Im folgenden Codebeispiel wird veranschaulicht, wie das Kennwort so eingestellt wird, dass es niemals abläuft. Dazu wird die Properties-Methode für den Zugriff auf die userAccountControl-Eigenschaft verwendet, um das in der ADS_USER_FLAG_ENUM-Enumeration definierte ADS_UF_DONT_EXPIRE_PASSWD-Flag zu setzen.
Shared Sub DontExpirePassword(User As DirectoryEntry)
Dim val As Integer
Const ADS_UF_DONT_EXPIRE_PASSWD As Integer = &H10000
val = Fix(User.Properties("userAccountControl").Value)
User.Properties("userAccountControl").Value = val Or ADS_UF_DONT_EXPIRE_PASSWD
User.CommitChanges()
End Sub 'DontExpirePassword
using System;
using System.DirectoryServices;
using ActiveDs;
static void DontExpirePassword(DirectoryEntry User)
{
int val;
const int ADS_UF_DONT_EXPIRE_PASSWD =0x10000;
val = (int) User.Properties["userAccountControl"].Value;
User.Properties["userAccountControl"].Value = val |
ADS_UF_DONT_EXPIRE_PASSWD;
User.CommitChanges();
}
Siehe auch
Referenz
Konzepte
Benutzerverwaltung
Verwenden von COM-Interop für den Zugriff auf ADSI
Send comments about this topic to Microsoft.
Copyright © 2007 Microsoft Corporation. Alle Rechte vorbehalten.