読み取りユーザーがパスワードを変更できない (WinNTプロバイダー)
ユーザーが自分のパスワードを変更できるかどうかは、許可または拒否できるアクセス許可です。 ユーザーがWinNTプロバイダーでこのアクセス許可を付与されているかどうかを確認するには、ユーザーオブジェクトのuserFlagsプロパティのADS_UF_PASSWD_CANT_CHANGE フラグを読み取ります。 ADS_UF_PASSWD_CANT_CHANGEフラグは、ADS_USER_FLAG_ENUM列挙体で定義されています。
コード例
次のコード例は、ユーザーオブジェクトのuserFlagsプロパティのADS_UF_PASSWD_CANT_CHANGEフラグを取得する方法を示しています。
Const ADS_UF_PASSWD_CANT_CHANGE = &H40
Function UserCannotChangePassword(strDomain As String, strUser As String, strUserCred As String, strPassword As String) As Boolean
UserCannotChangePassword = False
Dim oUser As IADs
strPath = "WinNT://" + strDomain + "/" + strUser
If "" <> strUserCred Then
Dim dso As IADsOpenDSObject
' Bind to the group with the specified user name and password.
Set dso = GetObject("WinNT:")
Set oUser = dso.OpenDSObject(strPath, strUserCred, strPassword, 1)
Else
' Bind to the group with the current credentials.
Set oUser = GetObject(strPath)
End If
If (oUser.Get("userFlags") And ADS_UF_PASSWD_CANT_CHANGE) <> 0 Then
UserCannotChangePassword = True
Else
UserCannotChangePassword = False
End If
End Function
次のコード例は、ユーザーオブジェクトのuserFlagsプロパティのADS_UF_PASSWD_CANT_CHANGEフラグを取得する方法を示しています。
//***************************************************************************
//
// UserCannotChangePassword()
//
//***************************************************************************
HRESULT UserCannotChangePassword(LPCWSTR pwszDomain,
LPCWSTR pwszUser,
LPCWSTR pwszUserCred,
LPCWSTR pwszPassword,
BOOL *pfCannotChangePassword)
{
if(NULL == pwszDomain || NULL == pwszUser)
{
return E_INVALIDARG;
}
*pfCannotChangePassword = FALSE;
HRESULT hr;
IADs *pads;
CComBSTR sbstrADsPath = L"WinNT://";
sbstrADsPath += pwszDomain;
sbstrADsPath += "/";
sbstrADsPath += pwszUser;
hr = ADsOpenObject( sbstrADsPath,
pwszUserCred,
pwszPassword,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&pads);
if(SUCCEEDED(hr))
{
CComVariant svar;
hr = pads->Get(CComBSTR("userFlags"), &svar);
if(SUCCEEDED(hr))
{
if(ADS_UF_PASSWD_CANT_CHANGE & svar.lVal)
{
*pfCannotChangePassword = TRUE;
}
else
{
*pfCannotChangePassword = FALSE;
}
}
pads->Release();
}
return hr;
}