using System;
using System.DirectoryServices;
namespace SystemFrameworks.Helper
{
///
/// 活动目录辅助类。封装一系列活动目录操作相关的方法。
///
public sealed class ADHelper
{
///
/// 域名
///
private static string DomainName = "MyDomain";
///
/// LDAP 地址
///
private static string LDAPDomain = "DC=MyDomain,DC=local";
///
/// LDAP绑定路径
///
private static string ADPath = "LDAP://brooks.mydomain.local";
///
/// 登录帐号
///
private static string ADUser = "Administrator";
///
/// 登录密码
///
private static string ADPassword = "password";
///
/// 扮演类实例
///
private static IdentityImpersonation impersonate = new IdentityImpersonation(ADUser, ADPassword, DomainName);
///
/// 用户登录验证结果
///
public enum LoginResult
{
///
/// 正常登录
///
LOGIN_USER_OK = 0,
///
/// 用户不存在
///
LOGIN_USER_DOESNT_EXIST,
///
/// 用户帐号被禁用
///
LOGIN_USER_ACCOUNT_INACTIVE,
///
/// 用户密码不正确
///
LOGIN_USER_PASSWORD_INCORRECT
}
///
/// 用户属性定义标志
///
public enum ADS_USER_FLAG_ENUM
{
///
/// 登录脚本标志。如果通过 ADSI LDAP 进行读或写操作时,该标志失效。如果通过 ADSI WINNT,该标志为只读。
///
ADS_UF_SCRIPT = 0X0001,
///
/// 用户帐号禁用标志
///
ADS_UF_ACCOUNTDISABLE = 0X0002,
///
/// 主文件夹标志
///
ADS_UF_HOMEDIR_REQUIRED = 0X0008,
///
/// 过期标志
///
ADS_UF_LOCKOUT = 0X0010,
///
/// 用户密码不是必须的
///
ADS_UF_PASSWD_NOTREQD = 0X0020,
///
/// 密码不能更改标志
///
ADS_UF_PASSWD_CANT_CHANGE = 0X0040,
///
/// 使用可逆的加密保存密码
///
ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0X0080,
///
/// 本地帐号标志
///
ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0X0100,
///
/// 普通用户的默认帐号类型
///
ADS_UF_NORMAL_ACCOUNT = 0X0200,
///
/// 跨域的信任帐号标志
///
ADS_UF_INTERDOMAIN_TRUST_ACCOUNT = 0X0800,
///
/// 工作站信任帐号标志
///
ADS_UF_WORKSTATION_TRUST_ACCOUNT = 0x1000,
///
/// 服务器信任帐号标志
///
ADS_UF_SERVER_TRUST_ACCOUNT = 0X2000,
///
/// 密码永不过期标志
///
ADS_UF_DONT_EXPIRE_PASSWD = 0X10000,
///
/// MNS 帐号标志
///
ADS_UF_MNS_LOGON_ACCOUNT = 0X20000,
///
/// 交互式登录必须使用智能卡
///
ADS_UF_SMARTCARD_REQUIRED = 0X40000,
///
/// 当设置该标志时,服务帐号(用户或计算机帐号)将通过 Kerberos 委托信任
///
ADS_UF_TRUSTED_FOR_DELEGATION = 0X80000,
///
/// 当设置该标志时,即使服务帐号是通过 Kerberos 委托信任的,敏感帐号不能被委托
///
ADS_UF_NOT_DELEGATED = 0X100000,
///
/// 此帐号需要 DES 加密类型
///
ADS_UF_USE_DES_KEY_ONLY = 0X200000,
///
/// 不要进行 Kerberos 预身份验证
///
ADS_UF_DONT_REQUIRE_PREAUTH = 0X4000000,
///
/// 用户密码过期标志
///
ADS_UF_PASSWORD_EXPIRED = 0X800000,
///
/// 用户帐号可委托标志
///
ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 0X1000000
}
public ADHelper()
{
//
}
#region GetDirectoryObject
///
/// 获得DirectoryEntry对象实例,以管理员登陆AD
///
///
private static DirectoryEntry GetDirectoryObject()
{
DirectoryEntry entry = new DirectoryEntry(ADPath, ADUser, ADPassword, AuthenticationTypes.Secure);
return entry;
}
///
/// 根据指定用户名和密码获得相应DirectoryEntry实体
///
///
///
///
private static DirectoryEntry GetDirectoryObject(string userName, string password)
{
DirectoryEntry entry = new DirectoryEntry(ADPath, userName, password, AuthenticationTypes.None);
return entry;
}
///
/// i.e. /CN=Users,DC=creditsights, DC=cyberelves, DC=Com
///
///
///
private static DirectoryEntry GetDirectoryObject(string domainReference)
{
DirectoryEntry entry = new DirectoryEntry(ADPath + domainReference, ADUser, ADPassword, AuthenticationTypes.Secure);
return entry;
}
///
/// 获得以UserName,Password创建的DirectoryEntry
///
///
///
///
///
private static DirectoryEntry GetDirectoryObject(string domainReference, string userName, string password)
{
DirectoryEntry entry = new DirectoryEntry(ADPath + domainReference, userName, password, AuthenticationTypes.Secure);
return entry;
}
#endregion
#region GetDirectoryEntry
///
/// 根据用户公共名称取得用户的 对象
///
/// 用户公共名称
/// 如果找到该用户,则返回用户的 对象;否则返回 null
public static DirectoryEntry GetDirectoryEntry(string commonName)
{
DirectoryEntry de = GetDirectoryObject();
DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName + "))";
deSearch.SearchScope = SearchScope.Subtree;
try
{
SearchResult result = deSearch.FindOne();
de = new DirectoryEntry(result.Path);
return de;
}
catch
{
return null;
}
}
///
/// 根据用户公共名称和密码取得用户的 对象。
///
/// 用户公共名称
/// 用户密码
/// 如果找到该用户,则返回用户的 对象;否则返回 null
public static DirectoryEntry GetDirectoryEntry(string commonName, string password)
{
DirectoryEntry de = GetDirectoryObject(commonName, password);
DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName + "))";
deSearch.SearchScope = SearchScope.Subtree;
try
{
SearchResult result = deSearch.FindOne();
de = new DirectoryEntry(result.Path);
return de;
}
catch
{
return null;
}
}
///
/// 根据用户帐号称取得用户的 对象
///
/// 用户帐号名
/// 如果找到该用户,则返回用户的 对象;否则返回 null
public static DirectoryEntry GetDirectoryEntryByAccount(string sAMAccountName)
{
DirectoryEntry de = GetDirectoryObject();
DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(sAMAccountName=" + sAMAccountName + "))";
deSearch.SearchScope = SearchScope.Subtree;
try
{
SearchResult result = deSearch.FindOne();
de = new DirectoryEntry(result.Path);
return de;
}
catch
{
return null;
}
}
///
/// 根据用户帐号和密码取得用户的 对象
///
/// 用户帐号名
/// 用户密码
/// 如果找到该用户,则返回用户的 对象;否则返回 null
public static DirectoryEntry GetDirectoryEntryByAccount(string sAMAccountName, string password)
{
DirectoryEntry de = GetDirectoryEntryByAccount(sAMAccountName);
if (de != null)
{
string commonName = de.Properties["cn"][0].ToString();
if (GetDirectoryEntry(commonName, password) != null)
return GetDirectoryEntry(commonName, password);
else
return null;
}
else
{
return null;
}
}
///
/// 根据组名取得用户组的 对象
///
/// 组名
///
public static DirectoryEntry GetDirectoryEntryOfGroup(string groupName)
{
DirectoryEntry de = GetDirectoryObject();
DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.Filter = "(&(objectClass=group)(cn=" + groupName + "))";
deSearch.SearchScope = SearchScope.Subtree;
try
{
SearchResult result = deSearch.FindOne();
de = new DirectoryEntry(result.Path);
return de;
}
catch
{
return null;
}
}
#endregion
#region GetProperty
///
/// 获得指定 指定属性名对应的值
///
///
/// 属性名称
/// 属性值
public static string GetProperty(DirectoryEntry de, string propertyName)
{
if(de.Properties.Contains(propertyName))
{
return de.Properties[propertyName][0].ToString() ;
}
else
{
return string.Empty;
}
}
///
/// 获得指定搜索结果 中指定属性名对应的值
///
///
/// 属性名称
/// 属性值
public static string GetProperty(SearchResult searchResult, string propertyName)
{
if(searchResult.Properties.Contains(propertyName))
{
return searchResult.Properties[propertyName][0].ToString() ;
}
else
{
return string.Empty;
}
}
#endregion
///
/// 设置指定 的属性值
///
///
/// 属性名称
/// 属性值
public static void SetProperty(DirectoryEntry de, string propertyName, string propertyValue)
{
if(propertyValue != string.Empty || propertyValue != "" || propertyValue != null)
{
if(de.Properties.Contains(propertyName))
{
de.Properties[propertyName][0] = propertyValue;
}
else
{
de.Properties[propertyName].Add(propertyValue);
}
}
}
///
/// 创建新的用户
///
/// DN 位置。例如:OU=共享平台 或 CN=Users
/// 公共名称
/// 帐号
/// 密码
///
public static DirectoryEntry CreateNewUser(string ldapDN, string commonName, string sAMAccountName, string password)
{
DirectoryEntry entry = GetDirectoryObject();
DirectoryEntry subEntry = entry.Children.Find(ldapDN);
DirectoryEntry deUser = subEntry.Children.Add("CN=" + commonName, "user");
deUser.Properties["sAMAccountName"].Value = sAMAccountName;
deUser.CommitChanges();
ADHelper.EnableUser(commonName);
ADHelper.SetPassword(commonName, password);
deUser.Close();
return deUser;
}
///
/// 创建新的用户。默认创建在 Users 单元下。
///
/// 公共名称
/// 帐号
/// 密码
///
public static DirectoryEntry CreateNewUser(string commonName, string sAMAccountName, string password)
{
return CreateNewUser("CN=Users", commonName, sAMAccountName, password);
}
///
/// 判断指定公共名称的用户是否存在
///
/// 用户公共名称
/// 如果存在,返回 true;否则返回 false
public static bool IsUserExists(string commonName)
{
DirectoryEntry de = GetDirectoryObject();
DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName + "))"; // LDAP 查询串
SearchResultCollection results = deSearch.FindAll();
if (results.Count == 0)
return false;
else
return true;
}
///
/// 判断用户帐号是否激活
///
/// 用户帐号属性控制器
/// 如果用户帐号已经激活,返回 true;否则返回 false
public static bool IsAccountActive(int userAccountControl)
{
int userAccountControl_Disabled = Convert.ToInt32(ADS_USER_FLAG_ENUM.ADS_UF_ACCOUNTDISABLE);
int flagExists = userAccountControl & userAccountControl_Disabled;
if (flagExists > 0)
return false;
else
return true;
}
///
/// 判断用户与密码是否足够以满足身份验证进而登录
///
/// 用户公共名称
/// 密码
/// 如能可正常登录,则返回 true;否则返回 false
public static LoginResult Login(string commonName, string password)
{
DirectoryEntry de = GetDirectoryEntry(commonName);
if (de != null)
{
// 必须在判断用户密码正确前,对帐号激活属性进行判断;否则将出现异常。
int userAccountControl = Convert.ToInt32(de.Properties["userAccountControl"][0]);
de.Close();
if (!IsAccountActive(userAccountControl))
return LoginResult.LOGIN_USER_ACCOUNT_INACTIVE;
if (GetDirectoryEntry(commonName, password) != null)
return LoginResult.LOGIN_USER_OK;
else
return LoginResult.LOGIN_USER_PASSWORD_INCORRECT;
}
else
{
return LoginResult.LOGIN_USER_DOESNT_EXIST;
}
}
///
/// 判断用户帐号与密码是否足够以满足身份验证进而登录
///
/// 用户帐号
/// 密码
/// 如能可正常登录,则返回 true;否则返回 false
public static LoginResult LoginByAccount(string sAMAccountName, string password)
{
DirectoryEntry de = GetDirectoryEntryByAccount(sAMAccountName);
if (de != null)
{
// 必须在判断用户密码正确前,对帐号激活属性进行判断;否则将出现异常。
int userAccountControl = Convert.ToInt32(de.Properties["userAccountControl"][0]);
de.Close();
if (!IsAccountActive(userAccountControl))
return LoginResult.LOGIN_USER_ACCOUNT_INACTIVE;
if (GetDirectoryEntryByAccount(sAMAccountName, password) != null)
return LoginResult.LOGIN_USER_OK;
else
return LoginResult.LOGIN_USER_PASSWORD_INCORRECT;
}
else
{
return LoginResult.LOGIN_USER_DOESNT_EXIST;
}
}
///
/// 设置用户密码,管理员可以通过它来修改指定用户的密码。
///
/// 用户公共名称
/// 用户新密码
public static void SetPassword(string commonName, string newPassword)
{
DirectoryEntry de = GetDirectoryEntry(commonName);
// 模拟超级管理员,以达到有权限修改用户密码
impersonate.BeginImpersonate();
de.Invoke("SetPassword", new object[]{newPassword});
impersonate.StopImpersonate();
de.Close();
}
///
/// 设置帐号密码,管理员可以通过它来修改指定帐号的密码。
///
/// 用户帐号
/// 用户新密码
public static void SetPasswordByAccount(string sAMAccountName, string newPassword)
{
DirectoryEntry de = GetDirectoryEntryByAccount(sAMAccountName);
// 模拟超级管理员,以达到有权限修改用户密码
IdentityImpersonation impersonate = new IdentityImpersonation(ADUser, ADPassword, DomainName);
impersonate.BeginImpersonate();
de.Invoke("SetPassword", new object[]{newPassword});
impersonate.StopImpersonate();
de.Close();
}
///
/// 修改用户密码
///
/// 用户公共名称
/// 旧密码
/// 新密码
public static void ChangeUserPassword (string commonName, string oldPassword, string newPassword)
{
// to-do: 需要解决密码策略问题
DirectoryEntry oUser = GetDirectoryEntry(commonName);
oUser.Invoke("ChangePassword", new Object[]{oldPassword, newPassword});
oUser.Close();
}
///
/// 启用指定公共名称的用户
///
/// 用户公共名称
public static void EnableUser(string commonName)
{
EnableUser(GetDirectoryEntry(commonName));
}
///
/// 启用指定 的用户
///
///
public static void EnableUser(DirectoryEntry de)
{
impersonate.BeginImpersonate();
de.Properties["userAccountControl"][0] = ADHelper.ADS_USER_FLAG_ENUM.ADS_UF_NORMAL_ACCOUNT | ADHelper.ADS_USER_FLAG_ENUM.ADS_UF_DONT_EXPIRE_PASSWD;
de.CommitChanges();
impersonate.StopImpersonate();
de.Close();
}
///
/// 禁用指定公共名称的用户
///
/// 用户公共名称
public static void DisableUser(string commonName)
{
DisableUser(GetDirectoryEntry(commonName));
}
///
/// 禁用指定 的用户
///
///
public static void DisableUser(DirectoryEntry de)
{
impersonate.BeginImpersonate();
de.Properties["userAccountControl"][0]=ADHelper.ADS_USER_FLAG_ENUM.ADS_UF_NORMAL_ACCOUNT | ADHelper.ADS_USER_FLAG_ENUM.ADS_UF_DONT_EXPIRE_PASSWD | ADHelper.ADS_USER_FLAG_ENUM.ADS_UF_ACCOUNTDISABLE;
de.CommitChanges();
impersonate.StopImpersonate();
de.Close();
}
///
/// 将指定的用户添加到指定的组中。默认为 Users 下的组和用户。
///
/// 用户公共名称
/// 组名
public static void AddUserToGroup(string userCommonName, string groupName)
{
DirectoryEntry oGroup = GetDirectoryEntryOfGroup(groupName);
DirectoryEntry oUser = GetDirectoryEntry(userCommonName);
impersonate.BeginImpersonate();
oGroup.Properties["member"].Add(oUser.Properties["distinguishedName"].Value);
oGroup.CommitChanges();
impersonate.StopImpersonate();
oGroup.Close();
oUser.Close();
}
///
/// 将用户从指定组中移除。默认为 Users 下的组和用户。
///
/// 用户公共名称
/// 组名
public static void RemoveUserFromGroup(string userCommonName, string groupName)
{
DirectoryEntry oGroup = GetDirectoryEntryOfGroup(groupName);
DirectoryEntry oUser = GetDirectoryEntry(userCommonName);
impersonate.BeginImpersonate();
oGroup.Properties["member"].Remove(oUser.Properties["distinguishedName"].Value);
oGroup.CommitChanges();
impersonate.StopImpersonate();
oGroup.Close();
oUser.Close();
}
}
///
/// 用户模拟角色类。实现在程序段内进行用户角色模拟。
///
public class IdentityImpersonation
{
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
// 要模拟的用户的用户名、密码、域(机器名)
private String _sImperUsername;
private String _sImperPassword;
private String _sImperDomain;
// 记录模拟上下文
private WindowsImpersonationContext _imperContext;
private IntPtr _adminToken;
private IntPtr _dupeToken;
// 是否已停止模拟
private Boolean _bClosed;
///
/// 构造函数
///
/// 所要模拟的用户的用户名
/// 所要模拟的用户的密码
/// 所要模拟的用户所在的域
public IdentityImpersonation(String impersonationUsername, String impersonationPassword, String impersonationDomain)
{
_sImperUsername = impersonationUsername;
_sImperPassword = impersonationPassword;
_sImperDomain = impersonationDomain;
_adminToken = IntPtr.Zero;
_dupeToken = IntPtr.Zero;
_bClosed = true;
}
///
/// 析构函数
///
~IdentityImpersonation()
{
if(!_bClosed)
{
StopImpersonate();
}
}
///
/// 开始身份角色模拟。
///
///
public Boolean BeginImpersonate()
{
Boolean bLogined = LogonUser(_sImperUsername, _sImperDomain, _sImperPassword, 2, 0, ref _adminToken);
if(!bLogined)
{
return false;
}
Boolean bDuped = DuplicateToken(_adminToken, 2, ref _dupeToken);
if(!bDuped)
{
return false;
}
WindowsIdentity fakeId = new WindowsIdentity(_dupeToken);
_imperContext = fakeId.Impersonate();
_bClosed = false;
return true;
}
///
/// 停止身分角色模拟。
///
public void StopImpersonate()
{
_imperContext.Undo();
CloseHandle(_dupeToken);
CloseHandle(_adminToken);
_bClosed = true;
}
}
}
posted @ 2004-09-16 09:44 josson 阅读(21) | 评论 (0) | 编辑 收藏
2004年9月9日 #
打开SPS虚拟站点的根目录下的web.config文件,找到下面这行:
<trust level="WSS_Minimal" originUrl="" />
将其修改为:
<trust level="WSS_Medium" originUrl="" />
提示:
WebPart在默认的安全等级下是无法访问SharePoint Object Model的(即无法通过WSS SDK来访问SPS站点中的列表、文档库、文档、用户等信息、AD),为了让我们的WebPart能正常工作,我们可以:
★ 为这个WebPart创建一个单独的Policy文件
★ 将WebPart的(.dll)文件加上StrongName后放入GAC中
★ 提升整个SPS虚拟站点的信任等级
上面采用的是第三种方法,将默认的信任等级从WSS_Minimal提升到WSS_Medium(最高等级为Full)。
安装到 GAC 中以实现完全信任
当您使用 Stsadm.exe 工具为具有强名称的程序集安装 Web 部件 .cab 文件时,可以使用 globalinstall 命令行开关将其安装到 GAC 中,如下所示:
Stsadm.exe –o addwppack –filename path_to_Web_Part.cab file -globalinstall
您还可以将具有强名称的 Web 部件程序集手动安装到 GAC 中,方法是将该 Web 部件的 .dll 文件拖到下面的特殊文件夹中:
local_drive:\Windows\Assembly
posted @ 2004-09-09 15:32 josson 阅读(13) | 评论 (0) | 编辑 收藏
SharePoint Web Part development met C# - deel 1(转:web部件制作)
http://www.sdgn.nl/Default.asp?A1PID=57PDGUH&A1SID=229854200434&URL=154106PDWL
Inleiding Web Part development
Met Microsoft SharePoint Portal Server kun je portal-oplossingen ontwikkelen waarin kennis en expertise uit verschillende bronnen gebundeld aan gebruikers kunnen worden aangeboden. SharePoint biedt een krachtige zoekmachine en document management mogelijkheden.
Het scherm van een SharePoint pagina is opgebouwd uit verschillende onderdelen, die Web Parts worden genoemd. Omdat SharePoint Portal Server gebruik maakt van .NET technologie kunnen deze Web Parts in C# ontwikkeld worden.
Dit is het eerste deel in een serie artikelen over SharePoint Web Part development. In dit artikel bouwen we met behulp van een Web Part template ons eigen Web Part. Dit Web Part zal de account-name tonen van de ingelogde user. Dat is voor ontwikkelaars handig om standaard op de home page van de portal te tonen, o.a. omdat een ontwikkelaar regelmatig onder verschillende accounts aan zal moeten loggen om zijn Web Parts te testen. In het volgende artikel zal de functionaliteit van het Web Part worden uitgebreid.
Fig. 1: UserName Web Part
Web Part templates
Een Web Part bestaat uit een aantal onderdelen. Met behulp van Web Part templates zijn deze eenvoudig aan te maken. De Web Part templates kun je downloaden vanaf de Microsoft site. Deze Web Part templates werken voor .NET 2002 en 2003. Bij het installeren krijg je de mogelijkheid om te kiezen voor C# of VB.NET. Wanneer je alleen ontwikkelt in C#, is het installeren van de C# templates voldoende.
Web Part templates downloaden:
(Web PartTemplatesforVSNetSample.EXE)
Web Part project aanmaken
Wanneer je de Web Part templates hebt geïnstalleerd, kun je een Web Part project aanmaken in de .NET Development Environment. Maak een nieuw project aan, en kies voor een C# Web Part Library.
Als je geen gebruik maakt van de Web Part templates, kun je de verschillende onderdelen van een Web Part project met de hand aanmaken. Zet dan zelf een referentie naar de Microsoft.SharePoint assembly.
Fig. 2: Nieuw Web Part Library projectEen Web Part project bestaat uit de volgende onderdelen:
· Web Part class (Web Part1.cs); deze bevat de code van het Web Part
· Web Part definitie file (Web Part1.dwp); het .dwp bestand bevat de definitie van het Web Part, en is vergelijkbaar met de .dwp files uit SharePoint 2001
· manifest (Manifest.XML); het manifest bevat de informatie die nodig is om het Web Part succesvol te kunnen deployen
· assembly informatie (AssemblyInfo.cs)
In het Web Part project is bovendien een referentie aangemaakt naar de Microsoft.SharePoint assembly. In de volgende paragrafen zullen we in detail kijken naar de onderdelen van het Web Part project, en deze aanpassen voor ons UserName Web Part.
Fig. 3: Onderdelen Web Part Template project
WebpartUser.cs
De Web Part class bevat de code van het Web Part. Een Web Part class is gebaseerd op de WebPart class uit de Microsoft.SharePoint.WebPartPages namespace. Dit wordt geregeld door te erven van Microsoft.SharePoint.WebPartPages.WebPart. In de code worden attributen gezet op class-nivo en op property-nivo. Deze attributen bepalen het gedrag van het Web Part.
We openen WebPart1.cs en veranderen de naam van de class en de bestandsnaam in WebPartUser. Op class-nivo kunnen we instellen wat de default property is van de WebPart class. Standaard worden Web Parts uitgerust met één property: “Text”.
Fig. 4: Web Part Class attributes
Het toevoegen van extra Web Part properties werkt hetzelfde als het toevoegen van properties aan ‘normale’ C# classes. We passen de standaardwaarde van de property Text aan.
Met het attribute
Browsable geven we aan dat de property via het web interface in de portal aangepast kan worden.
De Category waarin deze eigenschap in het task pane getoond zal worden is “Miscellaneous”. Wanneer je meerdere eigenschappen aan een Web Part hebt toegevoegd, kun je ervoor kiezen een eigen categorie toe te voegen door hier een andere naam in te vullen.
De Web Part Storage eigenschap bepaalt hoe de Web Part eigenschappen worden opgeslagen in de SharePoint database. De standaard waarde Personal betekent dat de waarde voor elke gebruiker wordt opgeslagen. Als je de waarde op Shared zet, wordt de property voor alle gebruikers opgeslagen. Wanneer je de Storage eigenschap op None zet, wordt de standaard waarde gebruikt en wordt de waarde van de eigenschap niet in de SharePoint database opgeslagen, maar wordt de standaard waarde in het Web Part getoond.
Fig. 5: Aangepaste code Web Part property “Text”
Fig. 6: Web Part properties aanpassen in de portal
Web Parts zijn bijzondere .NET Custom Controls. Dat betekent dat er geen grafische interface is waarmee je je Web Part kunt aanpassen. (Je kunt geen knoppen op je Web Part slepen.) In plaats daarvan bouw je je Web Part op in de RenderWeb Part method, die je kunt vergelijken met de Render method van een Custom Control.
Standaard staat in de RenderWeb Part method code die ervoor zorgt dat de Text property van het Web Part getoond wordt. Deze code vervangen we door code om de naam van de CurrentUser te tonen. Hiervoor gebruiken we het Context object.
Fig. 7: Aangepaste code Web Part method “RenderWebPart”
Tip:
Het Context object kun je gebruiken om informatie op te vragen over de context van het Web Part: de current user en de site waarin het Web Part is geplaatst.
Voorbeeld:
Using Microsoft.SharePoint.WebControls
SPWeb myWeb = SPControl.GetContextWeb(Context);
string UserName = myWeb.CurrentUser.LoginName;
myWeb is de SharePoint site waarop het Web Part is geplaatst.
WebPartUser.dwp
Bij elk Web Part hoort een .dwp bestand, waarin de Web Part eigenschappen staan ingesteld: Titel, Description, Assembly en TypeName. De Title en Description worden getoond wanneer gebruikers het Web Part in de portal plaatsen. De Description verschijnt als tooltip.
Het is belangrijk dat de Assembly en TypeName correct zijn ingevuld, omdat deze aangeven welke class de functionaliteit van het Web Part bevat. We veranderen de bestandsnaam in WebPartUser.dwp, en de TypeName in WebPartUser, zodat deze overeenkomt met de naam van de Web Part class.
Web Part eigenschappen kunnen ook in de Web Part definitie file worden vastgelegd. Wanneer we ons Web Part bijvoorbeeld standaard 20 pixels hoog willen maken voegen we de volgende tag toe: <Height>20px</Height>
Een Web Part zonder frame tonen kan als volgt: <FrameType>None</FrameType>
Fig. 8: Aangepaste code Web Part method “RenderWebPart”
Tip:
Wanneer je een overzicht wilt hebben van de Web Part eigenschappen die je via de Web Part definitie kunt vastleggen, kun je de pagina waarop het Web Part is geplaatst in Microsoft FrontPage 2003 openen. Elk Web Part wordt in de broncode van de pagina als XML getoond.
Tip:
De foutmelding “A Web Part or Web Form Control on this Web Part Page cannot be displayed or imported, because it is not registered on this site as safe” treedt op wanneer het dwp bestand onjuist is aangepast. De Typename moet kloppen!
Manifest.xml
In het manifest staat alle informatie die nodig is om het Web Part op de server te installeren. We passen de naam van het dwp file aan.
Fig. 9: Web Part manifest
Wanneer je Web Part gebruik maakt van bestanden die opgeleverd moeten worden met het Web Part, zet je in het manifest ook verwijzingen naar deze bestanden. Deze verwijzingen staan in de ClassResources tag. Wij verwijderen de ClassResources tag, omdat we voor ons Web Part geen andere bestanden nodig hebben.
Tip:
In het Manifest geef je ook aan welke resources (bestanden) met het Web Part opgeleverd moeten worden. Standaard staat deze XML tag nog niet uitgecommentarieerd.
Wanneer je de foutmelding “Can’t find this file specified in the file manifest.xml“ krijgt, moet je de lege ClassResources tag uit het Manifest verwijderen.
Assembly information
Voordat de Web Part code op de server kan worden uitgevoerd, moet het Web Part als safe control geregistreerd zijn op de server. Hiervoor moeten we het voorzien van een strong name. Met de Strong Name tool (sn.exe) maken we een keyfile aan, die we aan het project toevoegen. De enige aanpassing die we hoeven te doen aan de assembly information is het verwijzen naar de keyfile.
Bijvoorbeeld: [assembly: AssemblyKeyFile("..\\..\\SDGN.snk")]
Web Part opleveren op de server
Web Parts worden deployed in Web Part packs: CAB files die je met behulp van een Setup project kunt maken. Deze Web Part packs kunnen op de SharePoint server worden geregistreerd met de tool stsadm.exe.
Om het Web Part op te leveren voegen we eerst een Setup project toe aan de Web Part Solution. Aan deze CAB file voegen we toe: de primary output van het Web Part project, het manifest en de Web Part definitie file. (Wanneer je in de ClassResources tag van het manifest bestandsnamen hebt ingevuld, moet je deze ook aan de CAB file toevoegen.)
Fig. 10: Setup project
Met de tool Stsadm.exe registreren we de CAB file op de server. Wanneer je gebruik maakt deze tool wordt het Web Part automatisch aan de SafeControls verzameling toegevoegd in web.config. Om alle code in het webpart uit te kunnen voeren, wijzigen we het trust-level in web.config Het trus-tlevel dat nodig is voor het uitlezen van de ingelogde user is WSS_Medium (<trust level="WSS_Medium" originUrl="" />).
Wanneer je in je Web Part alleen HTML genereert, kun je het trust-level op WSS_Minimal laten staan.
Let op: in de productieomgeving zal het niet wenselijk zijn om het trust-level te verruimen. Dan zal gebruik gemaakt worden van “Custom trust levels”, en wordt precies vastgelegd welke acties Web Parts op de server uit mogen voeren.
We kunnen het Web Part nu registreren met stsadm. De tool stsadm staat in de folder <Root>:\Program Files\Common Files\Microsoft Shared\Web server extensions\60\bin. Het registreren van het Web Part kan met stsadm –o addwppack –f cabName (zie figuur 11).
Wanneer een Web Part geregistreerd is, kan het na wijzigingen met de force parameter opnieuw geregistreerd worden. Met de operation deletewppack kunnen Web Parts van de server verwijderd worden.
Fig. 11: Web Part deployment m.b.v. stsadm
Fig. 12: Web Part van de server verwijderen
Conclusie
In dit artikel hebben we een Web Part ontwikkeld met behulp van een Web Part template.
We hebben de eigenschappen van dit Web Part aangepast in code en met behulp van het Web Part definition bestand. We hebben code toegevoegd aan de RenderWebPart method, en het Web Part op de server geregistreerd met de tool stsadm. In de volgende artikelen over Web Part development zullen we ons Web Part project uitbreiden met nieuwe Web Parts met meer functionaliteit. Zoals Web Parts met controls en connected Web Parts (Web Parts die samenwerken met andere Web Parts op de pagina).
posted @ 2004-09-09 14:10 josson 阅读(13) | 评论 (0) | 编辑 收藏
SharePoint主页:
http://www.microsoft.com/sharepoint/
SharePoint Portal Server主页:
http://www.microsoft.com/office/sharepoint/prodinfo/default.mspx
SharePoint Service和SharePoint Portal Server有什么区别:
http://www.microsoft.com/sharepoint/evaluationoverview.asp
SharePoint开发中心:
http://msdn.microsoft.com/library/default.asp?url=/nhp/Default.asp?contentid=28001891
SharePoint Service 2003 (2.0) 下载:
SharePoint Service 2003 SDK 下载:
SharePoint Portal Server 2003 Eval Edittion:
SharePoint Portal Server 2003 Administrator's Guide:
SharePoint University :
以前SharePoint服务叫SharePoint Team Service,新版叫Team Service 2.0,后改名为SharePoint Service 2003,后来把核心服务集成进了Windows Server 2003,就叫做Windows SharePoint Service
http://blog.csdn.net/kiclee/archive/2004/07/28/SharePoint_HotLink.aspx
http://blog.joycode.com/kaneboy/category/791.aspx
http://communities.microsoft.com/newsgroups/default.asp?ICP=chinacommunity&sLCID=cn
http://msd2d.com/default_section.aspx?section=sharepoint
http://www.sharepointcode.com/ !
http://ipattern.com/simpleblog/PermLink.aspx?entryid=38
http://weblogs.asp.net/soever/category/1593.aspx
http://weblogs.asp.net/mnissen/category/3130.aspx
http://weblogs.asp.net/wkriebel/category/4089.aspx
http://weblogs.asp.net/jan/category/2443.aspx
http://blogs.sqlxml.org/bryantlikes/category/18.aspx
posted @ 2004-09-09 14:04 josson 阅读(17) | 评论 (0) | 编辑 收藏
//增加用户
string dom ="LDAP://intdomain.com/CN=Users,DC=intdomain,DC=com";
System.DirectoryServices.DirectoryEntry entry1 = new System.DirectoryServices.DirectoryEntry(dom);
DirectoryEntries myEntries = entry1.Children;
DirectoryEntry myDirectoryEntry = myEntries.Add("CN=myuser", "user");
myDirectoryEntry.Properties["givenname"].Value="test";
myDirectoryEntry.Properties["sn"].Value="htestsn";
myDirectoryEntry.Properties["displayname"].Value="testdisplayname";
myDirectoryEntry.Properties["mail"].Value="testmail";
myDirectoryEntry.CommitChanges();
//设置密码.
myDirectoryEntry.Invoke(“SetPassword“,newPassword);
posted @ 2004-09-09 14:02 josson 阅读(11) | 评论 (0) | 编辑 收藏
(转)http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/iadsuser.asp
To bind to a domain user through a WinNT provider, use the domain name as part of the ADsPath, as shown in the following code example.
GetObject("WinNT://MYDOMAIN/jeffsmith,user")
Similarly, use the computer name as part of the ADsPath to bind to a local user.
GetObject("WinNT://MYCOMPUTER/jeffsmith,user")
In Active Directory, domain users reside in the directory. The following code example shows how to bind to a domain user through an LDAP provider.
GetObject("LDAP://CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com")
However, local accounts reside in the local SAM database and the LDAP provider does not communicate with the local database. Thus, to bind to a local user, you must go through a WinNT provider as described in the second code example.
example:
//绑定域,修改用户密码.
DirecotryEntry entry = new DirectoryEntry(“WinNT://DEVTEST/Josson“,“Josson“,“pass“);
//LDAP绑定
//new DirectoryEntry(“LDAP://DEVTEST/CN=jin,CN=Users,DC=devtest,DC=com“,“Josson“,“pass“);
entry.Invork(“ChangePassword“,new object[]{oldPassword,newPassword});
posted @ 2004-09-09 13:57 josson 阅读(12) | 评论 (0) | 编辑 收藏
2004年6月22日 #
工作流(Workflow)就是自动运作的业务过程部分或整体,表现为参与者对文件、信息或任务按照规程采取行动,并令其在参与者之间传递。简单地说,工作流就是一系列相互衔接、自动进行的业务活动或任务。
http://www.delfan.com/workflow/
posted @ 2004-06-22 11:20 josson 阅读(73) | 评论 (0) | 编辑 收藏
2004年6月18日 #
http://community.csdn.net/Expert/topic/3102/3102187.xml?temp=.8055536
using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.Drawing.Imaging ;
using System.IO ;
//导入在程序中使用到的名称空间
public class Capture : Form
{
private System.ComponentModel.Container components = null ;
private Icon mNetTrayIcon = new Icon ( "Tray.ico" ) ;
private Bitmap MyImage = null ;
private NotifyIcon TrayIcon ;
private ContextMenu notifyiconMnu ;
public Capture ( )
{
//初始化窗体中使用到的组件
InitializeComponent ( ) ;
}
protected override void OnActivated ( EventArgs e )
{
this.Hide ( ) ;
}
[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
private static extern bool BitBlt (
IntPtr hdcDest , //目标设备的句柄
int nXDest , // 目标对象的左上角的X坐标
int nYDest , // 目标对象的左上角的X坐标
int nWidth , // 目标对象的矩形的宽度
int nHeight , // 目标对象的矩形的长度
IntPtr hdcSrc , // 源设备的句柄
int nXSrc , // 源对象的左上角的X坐标
int nYSrc , // 源对象的左上角的X坐标
System.Int32 dwRop // 光栅的操作值
) ;
[ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
private static extern IntPtr CreateDC (
string lpszDriver , // 驱动名称
string lpszDevice , // 设备名称
string lpszOutput , // 无用,可以设定位"NULL"
IntPtr lpInitData // 任意的打印机数据
) ;
public void capture ( object sender , System.EventArgs e )
{
this.Visible = false ;
IntPtr dc1 = CreateDC ( "DISPLAY" , null , null , ( IntPtr ) null ) ;
//创建显示器的DC
Graphics g1 = Graphics.FromHdc ( dc1 ) ;
//由一个指定设备的句柄创建一个新的Graphics对象
MyImage = new Bitmap ( Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bounds.Height , g1 ) ;
//根据屏幕大小创建一个与之相同大小的Bitmap对象
Graphics g2 = Graphics.FromImage ( MyImage ) ;
//获得屏幕的句柄
IntPtr dc3 = g1.GetHdc ( ) ;
//获得位图的句柄
IntPtr dc2 = g2.GetHdc ( ) ;
//把当前屏幕捕获到位图对象中
BitBlt ( dc2 , 0 , 0 , Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bounds.Height , dc3 , 0 , 0 , 13369376 ) ;
//把当前屏幕拷贝到位图中
g1.ReleaseHdc ( dc3 ) ;
//释放屏幕句柄
g2.ReleaseHdc ( dc2 ) ;
//释放位图句柄
MyImage.Save ( "c:\\MyJpeg.jpg" , ImageFormat.Jpeg ) ;
MessageBox.Show ( "已经把当前屏幕保存到C:\\MyJpeg.jpg文件中!" ) ;
this.Visible = true ;
}
public void ExitSelect ( object sender , System.EventArgs e )
{
//隐藏托盘程序中的图标
TrayIcon.Visible = false ;
//关闭系统
this.Close ( ) ;
}
//清除程序中使用过的资源
/*public override void Dispose( )
{
base.Dispose ( ) ;
if ( components != null )
components.Dispose ( ) ;
} */
private void InitializeComponent ( )
{
//设定托盘程序的各个属性
TrayIcon = new NotifyIcon ( ) ;
TrayIcon.Icon = mNetTrayIcon ;
TrayIcon.Text = "用C#做Screen Capture程序" ;
TrayIcon.Visible = true ;
//定义一个MenuItem数组,并把此数组同时赋值给ContextMenu对象
MenuItem [ ] mnuItms = new MenuItem [ 3 ] ;
mnuItms [ 0 ] = new MenuItem ( ) ;
mnuItms [ 0 ] .Text = "捕获当前屏幕!" ;
mnuItms [ 0 ] .Click += new System.EventHandler ( this.capture ) ;
mnuItms [ 1 ] = new MenuItem ( "-" ) ;
mnuItms [ 2 ] = new MenuItem ( ) ;
mnuItms [ 2 ] .Text = "退出系统" ;
mnuItms [ 2 ] .Click += new System.EventHandler ( this.ExitSelect ) ;
mnuItms [ 2 ] .DefaultItem = true ;
notifyiconMnu = new ContextMenu ( mnuItms ) ;
TrayIcon.ContextMenu = notifyiconMnu ;
//为托盘程序加入设定好的ContextMenu对象
this.SuspendLayout ( ) ;
this.AutoScaleBaseSize = new System.Drawing.Size ( 5 , 13 ) ;
this.ClientSize = new System.Drawing.Size ( 320 , 56 ) ;
this.ControlBox = false ;
this.MaximizeBox = false ;
this.MinimizeBox = false ;
this.WindowState = System.Windows.Forms.FormWindowState.Minimized ;
this.Name = "capture" ;
this.ShowInTaskbar = false ;
this.Text = "用C#做Screen Capture程序!" ;
this.ResumeLayout ( false ) ;
}
static void Main ( )
{
Application.Run ( new Capture ( ) ) ;
}
}