如何扩展c# DirectoryServices UserContext与msTSProfilePath, msTSHo
本文关键字:UserContext msTSProfilePath msTSHo DirectoryServices 何扩展 扩展 | 更新日期: 2023-09-27 18:17:27
我需要读/写ActiveDirectory用户对象终端服务属性。我试过了:
PrincipalContext context = new PrincipalContext(ContextType.Domain, "CA");
using (context)
{
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "CA''vlekovic");
if (user != null)
{
DirectoryEntry entry = (DirectoryEntry)user.GetUnderlyingObject();
entry.Properties["msTSProfilePath"].Value = "";
entry.Properties["msTSHomeDirectory"].Value = "";
entry.Properties["msTSHomeDrive"].Value = "";
entry.CommitChanges();
}
}
我试了这个:
PrincipalContext context = new PrincipalContext(ContextType.Domain, "CA");
using (context)
{
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "CA''vlekovic");
if (user != null)
{
DirectoryEntry entry = (DirectoryEntry)user.GetUnderlyingObject();
entry.InvokeSet("msTSProfilePath", "");
entry.InvokeSet("msTSHomeDirectory", "");
entry.InvokeSet("msTSHomeDrive", "");
entry.CommitChanges();
}
}
但是没有效果
我还尝试了以下属性名称:
- TerminalServicesProfilePath
- TerminalServicesHomeDirectory
- TerminalServicesHomeDrive
但是运气不好。任何帮助将不胜感激!
谢谢,Vojin
如果你使用。net 3.5及更高版本,并且使用System.DirectoryServices.AccountManagement
(S.DS.AM)命名空间,你可以很容易地扩展现有的UserPrincipal
类,以获得更高级的属性,如Manager
等。
阅读这里的所有内容:
- 管理。net Framework 3.5中的目录安全主体
- System.DirectoryServices.AccountManagement上的MSDN文档
基本上,您只需定义一个基于UserPrincipal
的派生类,然后定义您想要的其他属性:
[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("Person")]
public class UserPrincipalEx : UserPrincipal
{
// Implement the constructor using the base class constructor.
public UserPrincipalEx(PrincipalContext context) : base(context)
{ }
// Implement the constructor with initialization parameters.
public UserPrincipalEx(PrincipalContext context,
string samAccountName,
string password,
bool enabled) : base(context, samAccountName, password, enabled)
{}
// Create the "TermSrvProfilePath" property.
[DirectoryProperty("msTSProfilePath")]
public string TermSrvProfilePath
{
get
{
if (ExtensionGet("msTSProfilePath").Length != 1)
return string.Empty;
return (string)ExtensionGet("msTSProfilePath")[0];
}
set { ExtensionSet("msTSProfilePath", value); }
}
}
现在,您可以在代码中使用UserPrincipalEx
的"扩展"版本:
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
// Search the directory for the new object.
UserPrincipalEx inetPerson = UserPrincipalEx.FindByIdentity(ctx, IdentityType.SamAccountName, "someuser");
// you can easily access the TermSrvProfilePath now
string path = inetPerson.TermSrvProfilePath;
}
同样的方法,你也可以添加你想要的其他属性
我完全按照你告诉我们的做了。
我尝试用其他字段作为
[DirectoryProperty("wWWHomePage")]
public string wWWHomePage
{
get
{
if (ExtensionGet("wWWHomePage").Length != 1)
return null;
return (string)ExtensionGet("wWWHomePage")[0];
}
set { this.ExtensionSet("wWWHomePage", value); }
}
但是对于TermSrvProfilePath,它总是返回"empty"…