如何扩展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

如何扩展c# DirectoryServices UserContext与msTSProfilePath, msTSHo

如果你使用。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"…