顯示具有 ADSI 標籤的文章。 顯示所有文章
顯示具有 ADSI 標籤的文章。 顯示所有文章

2009年3月16日 星期一

ADSI技術文章-使用WinNT Provider取得User的Groups

public Dictionary GetWinNtUserGroups(string userName, string uName, string pwd)
{
Dictionary rv = new Dictionary();
string adsPath = string.Format("WinNT://{0}/{1},user", Environment.MachineName, userName);
if (DirectoryEntry.Exists(adsPath) == true)
{
DirectoryEntry user = new DirectoryEntry(adsPath, uName, pwd);
IADsGroup ig;
//叫用 Group 的 Members
object groups = user.Invoke("Groups", null);
DirectoryEntry gEntry;
foreach (object go in (IEnumerable)groups)
{
gEntry = new DirectoryEntry(go);
if (gEntry.SchemaClassName.ToLower() == "group")
{
ig = (IADsGroup)gEntry.NativeObject;
rv.Add(ig.Name, ig.Description);
}
}
}
return rv;
}

ADSI技術文章-使用WinNT Provider取得User的Groups

問題說明:
如果我們想使用WinNT Provider,取得user的群組清單,應該如何做呢?
下面範例會傳回一組群組名稱和描述的Dictionary資料:

public Dictionary GetWinNtUserGroups(string userName, string uName, string pwd)
{
Dictionary rv = new Dictionary();
string adsPath = string.Format("WinNT://{0}/{1},user", Environment.MachineName, userName);
if (DirectoryEntry.Exists(adsPath) == true)
{
DirectoryEntry user = new DirectoryEntry(adsPath, uName, pwd);
IADsGroup ig;
//叫用 User 的 Groups
object groups = user.Invoke("Groups", null);
DirectoryEntry gEntry;
foreach (object go in (IEnumerable)groups)
{
gEntry = new DirectoryEntry(go);
if (gEntry.SchemaClassName.ToLower() == "group")
{
ig = (IADsGroup)gEntry.NativeObject;
rv.Add(ig.Name, ig.Description);
}
}
}
return rv;
}
*使用IADsGroup的COM介面,可以輕鬆取得group的屬性。
*使用IADsGroup的COM介面,須參考ActiveDs.dll。

2009年3月13日 星期五

ADSI相關雜記

*Windows 2008 Server安裝Active Directory時,提供AdsiEdit.msc服務。使用該服務可以完整瀏覽與管理,AD的物件與物件屬性。

*Windows 2003 server使用ADSI WinNT Provider 新增、異動物件時,須設定:
同步處理目錄服務之帳號(本機安全性設定-使用者權利指派-同步處理目錄服務的資料)

2009年3月1日 星期日

ADSI技術文章-使用WinNT Provider取得Group的Users

問題說明:
如果我們想使用WinNT Provider,透過群組名稱取得所有的成員,應該如何做呢?
下面範例會傳回一組帳號和FullName的Dictionary資料:

public Dictionary GetWinNtGroupUsers(string groupName, string uName, string pwd)
{
Dictionary rv = new Dictionary();
string adsPath = string.Format("WinNT://{0}/{1},group", Environment.MachineName, groupName);
if (DirectoryEntry.Exists(adsPath) == true)
{
DirectoryEntry group = new DirectoryEntry(adsPath, uName, pwd);
IADsUser iu;
//叫用 Group 的 Members
object members = group.Invoke("Members", null);
DirectoryEntry mEntry;
foreach (object mb in (IEnumerable)members)
{
mEntry = new DirectoryEntry(mb);
if (mEntry.SchemaClassName.ToLower() == "user")
{
iu = (IADsUser)mEntry.NativeObject;
rv.Add(iu.Name, iu.FullName);
}
}
}
return rv;
}
*使用IADsUser的COM介面,可以輕鬆取得User的屬性。
*使用IADsUser的COM介面須加入ActiveDs.dll參考項。

2009年2月27日 星期五

ADSI技術文章-使用LDAP Provider取得Group的Users

問題說明:
如果我們想使用LDAP Provider,透過群組名稱取得所有的成員,應該如何做呢?
下面範例會傳回一組帳號和FullName的Dictionary資料:

public static Dictionary GetLDApGroupUsers(string ldapPath,string groupName,string uName,string pwd)
{
Dictionary rv=new Dictionary();
DirectoryEntry domain = new DirectoryEntry(ldapPath , uName, pwd);
DirectorySearcher search = new DirectorySearcher(domain);
search.SearchScope = SearchScope.Subtree;
//搜尋條件
search.Filter = string.Format("(&(objectclass=Group)(cn={0}))",groupName);
SearchResult result = search.FindOne();
if (result != null)
{
DirectoryEntry gEntry = result.GetDirectoryEntry();
DirectoryEntry mEntry;
IADsUser iu;
DataRow dr;
//叫用 Group 的 Members
object members = gEntry.Invoke("Members", null);
foreach (object mb in (IEnumerable)members)
{
mEntry = new DirectoryEntry(mb);
if (mEntry.SchemaClassName == "user")
{
iu = (IADsUser)mEntry.NativeObject;
rv.Add(iu.Name.Split('=')[1],iu.FullName));
}
}
}
return rv;
}
*使用IADsUser的COM介面,可以輕鬆取得User的屬性。

2009年2月7日 星期六

ADSI技術文章-使用LDAP Provider取得User的Primary Group

DirectoryEntry domain=new DirectoryEntry(ladpPath, accountName, pwd);
search.SearchScope = SearchScope.Subtree;
search.Filter = "(objectclass=User)";
SearchResult result = search.FindOne();
object primaryGroupID=result.Properties["primaryGroupID"][0];
DirectoryEntry gEntry = new DirectoryEntry(ldapRootPath,account,password);
DirectorySearcher search = new DirectorySearcher(gEntry);
search.SearchScope = SearchScope.Subtree;
search.Filter = "(objectclass=group)";
string rv = string.Empty;
try
{
SearchResultCollection result = search.FindAll();
string sid;
foreach (SearchResult sr in (IEnumerable)result)
{
sid = ObjectIdToString((byte[])sr.Properties["objectsid"][0]);
if (sid.EndsWith(primaryGroupID.ToString()) == true)
{
rv = sr.Properties["cn"][0].ToString();
break;
}
}
}
catch{
}


public string ObjectIdToString(byte[] oSid)
{
SecurityIdentifier sid = new SecurityIdentifier(oSid, 0);
return sid.ToString();
}

//重點提示:group objectSid 的尾碼==PrimaryGroupID

ADSI技術文章-使用LDAPProvider取得User的Groups

//方法一(ldap path 需包含使用者名稱)
DirectoryEntry domain=new DirectoryEntry(ladpPath, uName, pwd);
search.SearchScope = SearchScope.Subtree;
search.Filter = "(objectclass=User)";
SearchResult result = search.FindOne();
IADsUser iu = (IADsUser)result.GetDirectoryEntry().NativeObject;
List rv = new List();
foreach (IADsGroup item in (IEnumerable)iu.Groups())
rv.Add(item.Name.Split('=')[1]);

//方法二(ldap path 不包含使用者名稱)
DirectoryEntry domain=new DirectoryEntry(ladpPath, uName, pwd);
search.SearchScope = SearchScope.Subtree;
search.Filter = string.Format("(&(objectclass=User)(CN={0})",uName);
SearchResult result = search.FindOne();
IADsUser iu = (IADsUser)result.GetDirectoryEntry().NativeObject;
List rv = new List();
foreach (IADsGroup item in (IEnumerable)iu.Groups())
rv.Add(item.Name.Split('=')[1]);

-------------------------------------
使用IADsUser的Groups取得User的Groups
注意:此方法取得的Groups並不包含PrimaryGroup

2008年12月11日 星期四

使用XmlSerializer時出現無法產生暫存類別的錯誤!

在Asp.Net使用XmlSerializer時,如果網站應用程式的身分識別,使用Network Service時,預設情況會產生下列錯誤:
無法產生暫存類別 (result=1)。
error CS2001: 找不到原始程式檔 'C:\WINDOWS\TEMP\uacaqkr_.0.cs'
error CS2008: 未指定輸入
產生錯誤原因:因為.net framework需要使用到,Windows\Temp產生暫存類別,但預設權限不足產生的錯誤。
解決方法:將網站應用程式的身分識別提升為『本機系統』或是調整Windows\Temp的Network service權限為允許寫入。