C#操作域用户

  1 using System;

  2 using System.DirectoryServices;

  3 

  4 namespace SystemFrameworks.Helper

  5 {

  6      ///

  7      ///活动目录辅助类。封装一系列活动目录操作相关的方法。

  8      ///

  9      public sealed class ADHelper

 10      {

 11          ///

 12          ///域名

 13          ///

 14          private static string DomainName = "MyDomain";

 15          ///

 16          /// LDAP 地址

 17          ///

 18          private static string LDAPDomain = "DC=MyDomain,DC=local";

 19          ///

 20          /// LDAP绑定路径

 21          ///

 22          private static string ADPath = "LDAP://brooks.mydomain.local";

 23          ///

 24          ///登录帐号

 25          ///

 26          private static string ADUser = "Administrator";

 27          ///

 28          ///登录密码

 29          ///

 30          private static string ADPassword = "password";

 31          ///

 32          ///扮演类实例

 33          ///

 34          private static IdentityImpersonation impersonate = new IdentityImpersonation(ADUser, ADPassword, DomainName);

 35 

 36          ///

 37          ///用户登录验证结果

 38          ///

 39          public enum LoginResult

 40          {

 41               ///

 42               ///正常登录

 43               ///

 44               LOGIN_USER_OK = 0,

 45               ///

 46               ///用户不存在

 47               ///

 48               LOGIN_USER_DOESNT_EXIST,

 49               ///

 50               ///用户帐号被禁用

 51               ///

 52               LOGIN_USER_ACCOUNT_INACTIVE,

 53               ///

 54               ///用户密码不正确

 55               ///

 56               LOGIN_USER_PASSWORD_INCORRECT

 57          }

 58 

 59          ///

 60          ///用户属性定义标志

 61          ///

 62          public enum ADS_USER_FLAG_ENUM

 63          {

 64               ///

 65               ///登录脚本标志。如果通过 ADSI LDAP 进行读或写操作时,该标志失效。如果通过 ADSI WINNT,该标志为只读。

 66               ///

 67               ADS_UF_SCRIPT = 0X0001,

 68               ///

 69               ///用户帐号禁用标志

 70               ///

 71               ADS_UF_ACCOUNTDISABLE = 0X0002,

 72               ///

 73               ///主文件夹标志

 74               ///

 75               ADS_UF_HOMEDIR_REQUIRED = 0X0008,

 76               ///

 77               ///过期标志

 78               ///

 79               ADS_UF_LOCKOUT = 0X0010,

 80               ///

 81               ///用户密码不是必须的

 82               ///

 83               ADS_UF_PASSWD_NOTREQD = 0X0020,

 84               ///

 85               ///密码不能更改标志

 86               ///

 87               ADS_UF_PASSWD_CANT_CHANGE = 0X0040,

 88               ///

 89               ///使用可逆的加密保存密码

 90               ///

 91               ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0X0080,

 92               ///

 93               ///本地帐号标志

 94               ///

 95               ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0X0100,

 96               ///

 97               ///普通用户的默认帐号类型

 98               ///

 99               ADS_UF_NORMAL_ACCOUNT = 0X0200,

100               ///

101               ///跨域的信任帐号标志

102               ///

103               ADS_UF_INTERDOMAIN_TRUST_ACCOUNT = 0X0800,

104               ///

105               ///工作站信任帐号标志

106               ///

107               ADS_UF_WORKSTATION_TRUST_ACCOUNT = 0x1000,

108               ///

109               ///服务器信任帐号标志

110               ///

111               ADS_UF_SERVER_TRUST_ACCOUNT = 0X2000,

112               ///

113               ///密码永不过期标志

114               ///

115               ADS_UF_DONT_EXPIRE_PASSWD = 0X10000,

116               ///

117               /// MNS 帐号标志

118               ///

119               ADS_UF_MNS_LOGON_ACCOUNT = 0X20000,

120               ///

121               ///交互式登录必须使用智能卡

122               ///

123               ADS_UF_SMARTCARD_REQUIRED = 0X40000,

124               ///

125               ///当设置该标志时,服务帐号(用户或计算机帐号)将通过 Kerberos 委托信任

126               ///

127               ADS_UF_TRUSTED_FOR_DELEGATION = 0X80000,

128               ///

129               ///当设置该标志时,即使服务帐号是通过 Kerberos 委托信任的,敏感帐号不能被委托

130               ///

131               ADS_UF_NOT_DELEGATED = 0X100000,

132               ///

133               ///此帐号需要 DES 加密类型

134               ///

135               ADS_UF_USE_DES_KEY_ONLY = 0X200000,

136               ///

137               ///不要进行 Kerberos 预身份验证

138               ///

139               ADS_UF_DONT_REQUIRE_PREAUTH = 0X4000000,

140               ///

141               ///用户密码过期标志

142               ///

143               ADS_UF_PASSWORD_EXPIRED = 0X800000,

144               ///

145               ///用户帐号可委托标志

146               ///

147               ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 0X1000000

148          }

149 

150          public ADHelper()

151          {

152               //

153          }

154 

155          #region GetDirectoryObject

156 

157          ///

158          ///获得DirectoryEntry对象实例,以管理员登陆AD

159          ///

160          ///

161          private static DirectoryEntry GetDirectoryObject()

162          {

163               DirectoryEntry entry = new DirectoryEntry(ADPath, ADUser, ADPassword, AuthenticationTypes.Secure);

164               return entry;

165          }

166 

167          ///

168          ///根据指定用户名和密码获得相应DirectoryEntry实体

169          ///

170          ///

171          ///

172          ///

173          private static DirectoryEntry GetDirectoryObject(string userName, string password)

174          {

175               DirectoryEntry entry = new DirectoryEntry(ADPath, userName, password, AuthenticationTypes.None);

176               return entry;

177          }

178 

179          ///

180          /// i.e. /CN=Users,DC=creditsights, DC=cyberelves, DC=Com

181          ///

182          ///

183          ///

184          private static DirectoryEntry GetDirectoryObject(string domainReference)

185          {

186               DirectoryEntry entry = new DirectoryEntry(ADPath + domainReference, ADUser, ADPassword, AuthenticationTypes.Secure);

187               return entry;

188          }

189 

190          ///

191          ///获得以UserName,Password创建的DirectoryEntry

192          ///

193          ///

194          ///

195          ///

196          ///

197          private static DirectoryEntry GetDirectoryObject(string domainReference, string userName, string password)

198          {

199               DirectoryEntry entry = new DirectoryEntry(ADPath + domainReference, userName, password, AuthenticationTypes.Secure);

200               return entry;

201          }

202 

203          #endregion

204 

205          #region GetDirectoryEntry

206 

207          ///

208          ///根据用户公共名称取得用户的 对象

209          ///

210          ///

211 用户公共名称 

212          ///如果找到该用户,则返回用户的 对象;否则返回 null

213          public static DirectoryEntry GetDirectoryEntry(string commonName)

214          {

215               DirectoryEntry de = GetDirectoryObject();

216               DirectorySearcher deSearch = new DirectorySearcher(de);

217               deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName + "))";

218               deSearch.SearchScope = SearchScope.Subtree;

219 

220               try

221               {

222                    SearchResult result = deSearch.FindOne();

223                    de = new DirectoryEntry(result.Path);

224                    return de;

225               }

226               catch

227               {

228                    return null;

229               }

230          }

231 

232          ///

233          ///根据用户公共名称和密码取得用户的 对象。

234          ///

235          ///

236 用户公共名称 

237          ///

238 用户密码 

239          ///如果找到该用户,则返回用户的 对象;否则返回 null

240          public static DirectoryEntry GetDirectoryEntry(string commonName, string password)

241          {

242               DirectoryEntry de = GetDirectoryObject(commonName, password);

243               DirectorySearcher deSearch = new DirectorySearcher(de);

244               deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName + "))";

245               deSearch.SearchScope = SearchScope.Subtree;

246 

247               try

248               {

249                    SearchResult result = deSearch.FindOne();

250                    de = new DirectoryEntry(result.Path);

251                    return de;

252               }

253               catch

254               {

255                    return null;

256               }

257          }

258 

259          ///

260          ///根据用户帐号称取得用户的 对象

261          ///

262          ///

263 用户帐号名 

264          ///如果找到该用户,则返回用户的 对象;否则返回 null

265          public static DirectoryEntry GetDirectoryEntryByAccount(string sAMAccountName)

266          {

267               DirectoryEntry de = GetDirectoryObject();

268               DirectorySearcher deSearch = new DirectorySearcher(de);

269               deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(sAMAccountName=" + sAMAccountName + "))";

270               deSearch.SearchScope = SearchScope.Subtree;

271 

272               try

273               {

274                    SearchResult result = deSearch.FindOne();

275                    de = new DirectoryEntry(result.Path);

276                    return de;

277               }

278               catch

279               {



280                    return null;

281               }

282          }

283 

284          ///

285          ///根据用户帐号和密码取得用户的 对象

286          ///

287          ///

288 用户帐号名 

289          ///

290 用户密码 

291          ///如果找到该用户,则返回用户的 对象;否则返回 null

292          public static DirectoryEntry GetDirectoryEntryByAccount(string sAMAccountName, string password)

293          {

294               DirectoryEntry de = GetDirectoryEntryByAccount(sAMAccountName);

295               if (de != null)

296               {

297                    string commonName = de.Properties["cn"][0].ToString();

298 

299                    if (GetDirectoryEntry(commonName, password) != null)

300                        return GetDirectoryEntry(commonName, password);

301                    else

302                        return null;

303               }

304               else

305               {

306                    return null;

307               }

308          }

309 

310          ///

311          ///根据组名取得用户组的 对象

312          ///

313          ///

314 组名 

315          ///

316          public static DirectoryEntry GetDirectoryEntryOfGroup(string groupName)

317          {

318               DirectoryEntry de = GetDirectoryObject();

319               DirectorySearcher deSearch = new DirectorySearcher(de);

320               deSearch.Filter = "(&(objectClass=group)(cn=" + groupName + "))";

321               deSearch.SearchScope = SearchScope.Subtree;

322 

323               try

324               {

325                    SearchResult result = deSearch.FindOne();

326                    de = new DirectoryEntry(result.Path);

327                    return de;

328               }

329               catch

330               {

331                    return null;

332               }

333          }

334 

335          #endregion

336 

337          #region GetProperty

338 

339          ///

340          ///获得指定 指定属性名对应的值

341          ///

342          ///

343          ///

344 属性名称 

345          ///属性值

346          public static string GetProperty(DirectoryEntry de, string propertyName)

347          {

348               if(de.Properties.Contains(propertyName))

349               {

350                    return de.Properties[propertyName][0].ToString() ;

351               }

352               else

353               {

354                    return string.Empty;

355               }

356          }

357 

358          ///

359          ///获得指定搜索结果 中指定属性名对应的值

360          ///

361          ///

362          ///

363 属性名称 

364          ///属性值

365          public static string GetProperty(SearchResult searchResult, string propertyName)

366          {

367               if(searchResult.Properties.Contains(propertyName))

368               {

369                    return searchResult.Properties[propertyName][0].ToString() ;

370               }

371               else

372               {

373                    return string.Empty;

374               }

375          }

376 

377          #endregion

378 

379          ///

380          ///设置指定 的属性值

381          ///

382          ///

383          ///

384 属性名称 

385          ///

386 属性值 

387          public static void SetProperty(DirectoryEntry de, string propertyName, string propertyValue)

388          {

389               if(propertyValue != string.Empty || propertyValue != "" || propertyValue != null)

390               {

391                    if(de.Properties.Contains(propertyName))

392                    {

393                        de.Properties[propertyName][0] = propertyValue; 

394                    }

395                    else

396                    {

397                        de.Properties[propertyName].Add(propertyValue);

398                    }

399               }

400          }

401 

402          ///

403          ///创建新的用户

404          ///

405          ///

406 DN 位置。例如:OU=共享平台 或 CN=Users 

407          ///

408 公共名称 

409          ///

410 帐号 



411          ///

412 密码 

413          ///

414          public static DirectoryEntry CreateNewUser(string ldapDN, string commonName, string sAMAccountName, string password)

415          {

416               DirectoryEntry entry = GetDirectoryObject();

417               DirectoryEntry subEntry = entry.Children.Find(ldapDN);

418               DirectoryEntry deUser = subEntry.Children.Add("CN=" + commonName, "user");

419               deUser.Properties["sAMAccountName"].Value = sAMAccountName;

420               deUser.CommitChanges();

421               ADHelper.EnableUser(commonName);

422               ADHelper.SetPassword(commonName, password);

423               deUser.Close();

424               return deUser;

425          }

426 

427          ///

428          ///创建新的用户。默认创建在 Users 单元下。

429          ///

430          ///

431 公共名称 

432          ///

433 帐号 

434          ///

435 密码 

436          ///

437          public static DirectoryEntry CreateNewUser(string commonName, string sAMAccountName, string password)

438          {

439               return CreateNewUser("CN=Users", commonName, sAMAccountName, password);

440          }

441 

442          ///

443          ///判断指定公共名称的用户是否存在

444          ///

445          ///

446 用户公共名称 

447          ///如果存在,返回 true;否则返回 false

448          public static bool IsUserExists(string commonName)

449          {

450               DirectoryEntry de = GetDirectoryObject();

451               DirectorySearcher deSearch = new DirectorySearcher(de);

452               deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName + "))";       // LDAP 查询串

453               SearchResultCollection results = deSearch.FindAll();

454 

455               if (results.Count == 0)

456                    return false;

457               else

458                    return true;

459          }

460 

461          ///

462          ///判断用户帐号是否激活

463          ///

464          ///

465 用户帐号属性控制器 

466          ///如果用户帐号已经激活,返回 true;否则返回 false

467          public static bool IsAccountActive(int userAccountControl)

468          {

469               int userAccountControl_Disabled = Convert.ToInt32(ADS_USER_FLAG_ENUM.ADS_UF_ACCOUNTDISABLE);

470               int flagExists = userAccountControl & userAccountControl_Disabled;

471 

472               if (flagExists > 0)

473                    return false;

474               else

475                    return true;

476          }

477 

478          ///

479          ///判断用户与密码是否足够以满足身份验证进而登录

480          ///

481          ///

482 用户公共名称 

483          ///

484 密码 

485          ///如能可正常登录,则返回 true;否则返回 false

486          public static LoginResult Login(string commonName, string password)

487          {

488               DirectoryEntry de = GetDirectoryEntry(commonName);

489 

490               if (de != null)

491               {

492                    // 必须在判断用户密码正确前,对帐号激活属性进行判断;否则将出现异常。

493                    int userAccountControl = Convert.ToInt32(de.Properties["userAccountControl"][0]);

494                    de.Close();

495 

496                    if (!IsAccountActive(userAccountControl))

497                        return LoginResult.LOGIN_USER_ACCOUNT_INACTIVE;

498 

499                    if (GetDirectoryEntry(commonName, password) != null)

500                        return LoginResult.LOGIN_USER_OK;

501                    else

502                        return LoginResult.LOGIN_USER_PASSWORD_INCORRECT;

503               }

504               else

505               {

506                    return LoginResult.LOGIN_USER_DOESNT_EXIST; 

507               }

508          }

509 

510          ///

511          ///判断用户帐号与密码是否足够以满足身份验证进而登录

512          ///

513          ///

514 用户帐号 

515          ///

516 密码 

517          ///如能可正常登录,则返回 true;否则返回 false

518          public static LoginResult LoginByAccount(string sAMAccountName, string password)

519          {

520               DirectoryEntry de = GetDirectoryEntryByAccount(sAMAccountName);

521                    

522               if (de != null)

523               {

524                    // 必须在判断用户密码正确前,对帐号激活属性进行判断;否则将出现异常。

525                    int userAccountControl = Convert.ToInt32(de.Properties["userAccountControl"][0]);

526                    de.Close();

527 

528                    if (!IsAccountActive(userAccountControl))

529                        return LoginResult.LOGIN_USER_ACCOUNT_INACTIVE;

530 

531                    if (GetDirectoryEntryByAccount(sAMAccountName, password) != null)

532                        return LoginResult.LOGIN_USER_OK;

533                    else

534                        return LoginResult.LOGIN_USER_PASSWORD_INCORRECT;

535               }

536               else

537               {

538                    return LoginResult.LOGIN_USER_DOESNT_EXIST; 

539               }

540          }

541 

542          ///

543          ///设置用户密码,管理员可以通过它来修改指定用户的密码。

544          ///

545          ///

546 用户公共名称 

547          ///

548 用户新密码 

549          public static void SetPassword(string commonName, string newPassword)

550          {

551               DirectoryEntry de = GetDirectoryEntry(commonName);

552               

553               // 模拟超级管理员,以达到有权限修改用户密码

554               impersonate.BeginImpersonate();

555               de.Invoke("SetPassword", new object[]{newPassword});

556               impersonate.StopImpersonate();

557 

558               de.Close();

559          }

560 

561          ///

562          ///设置帐号密码,管理员可以通过它来修改指定帐号的密码。

563          ///

564          ///

565 用户帐号 

566          ///

567 用户新密码 

568          public static void SetPasswordByAccount(string sAMAccountName, string newPassword)

569          {

570               DirectoryEntry de = GetDirectoryEntryByAccount(sAMAccountName);

571 

572               // 模拟超级管理员,以达到有权限修改用户密码

573               IdentityImpersonation impersonate = new IdentityImpersonation(ADUser, ADPassword, DomainName);

574               impersonate.BeginImpersonate();

575               de.Invoke("SetPassword", new object[]{newPassword});

576               impersonate.StopImpersonate();

577 

578               de.Close();

579          }

580 

581          ///

582          ///修改用户密码

583          ///

584          ///

585 用户公共名称 

586          ///

587 旧密码 

588          ///

589 新密码 

590          public static void ChangeUserPassword (string commonName, string oldPassword, string newPassword)

591          {

592               // to-do: 需要解决密码策略问题

593               DirectoryEntry oUser = GetDirectoryEntry(commonName);

594               oUser.Invoke("ChangePassword", new Object[]{oldPassword, newPassword});

595               oUser.Close();

596          }

597 

598          ///

599          ///启用指定公共名称的用户

600          ///

601          ///

602 用户公共名称 

603          public static void EnableUser(string commonName)

604          {

605               EnableUser(GetDirectoryEntry(commonName));

606          }

607 

608          ///

609          ///启用指定 的用户

610          ///

611          ///

612          public static void EnableUser(DirectoryEntry de)

613          {

614               impersonate.BeginImpersonate();

615               de.Properties["userAccountControl"][0] = ADHelper.ADS_USER_FLAG_ENUM.ADS_UF_NORMAL_ACCOUNT | ADHelper.ADS_USER_FLAG_ENUM.ADS_UF_DONT_EXPIRE_PASSWD;

616               de.CommitChanges();

617               impersonate.StopImpersonate();

618               de.Close();

619          }

620 

621          ///

622          ///禁用指定公共名称的用户

623          ///

624          ///

625 用户公共名称 

626          public static void DisableUser(string commonName)

627          {

628               DisableUser(GetDirectoryEntry(commonName));

629          }

630 

631          ///

632          ///禁用指定 的用户

633          ///

634          ///

635          public static void DisableUser(DirectoryEntry de)

636          {

637               impersonate.BeginImpersonate();

638               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;

639               de.CommitChanges();

640               impersonate.StopImpersonate();

641               de.Close();

642          }

643 

644          ///

645          ///将指定的用户添加到指定的组中。默认为 Users 下的组和用户。

646          ///

647          ///

648 用户公共名称 

649          ///

650 组名 

651          public static void AddUserToGroup(string userCommonName, string groupName)

652           {

653               DirectoryEntry oGroup = GetDirectoryEntryOfGroup(groupName);

654               DirectoryEntry oUser = GetDirectoryEntry(userCommonName);

655               

656               impersonate.BeginImpersonate();

657               oGroup.Properties["member"].Add(oUser.Properties["distinguishedName"].Value);

658               oGroup.CommitChanges();

659               impersonate.StopImpersonate();

660 

661               oGroup.Close();

662               oUser.Close();

663          }

664 

665          ///

666          ///将用户从指定组中移除。默认为 Users 下的组和用户。

667          ///

668          ///

669 用户公共名称 

670          ///

671 组名 

672          public static void RemoveUserFromGroup(string userCommonName, string groupName)

673          {

674               DirectoryEntry oGroup = GetDirectoryEntryOfGroup(groupName);

675               DirectoryEntry oUser = GetDirectoryEntry(userCommonName);

676               

677               impersonate.BeginImpersonate();

678               oGroup.Properties["member"].Remove(oUser.Properties["distinguishedName"].Value);

679               oGroup.CommitChanges();

680               impersonate.StopImpersonate();

681 

682               oGroup.Close();

683               oUser.Close();

684          }

685 

686      }

687 

688      ///

689      ///用户模拟角色类。实现在程序段内进行用户角色模拟。

690      ///

691      public class IdentityImpersonation

692      {

693          [DllImport("advapi32.dll", SetLastError=true)]

694          public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

695 

696          [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]

697          public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);

698 

699          [DllImport("kernel32.dll", CharSet=CharSet.Auto)]

700          public extern static bool CloseHandle(IntPtr handle);

701 

702          // 要模拟的用户的用户名、密码、域(机器名)

703          private String _sImperUsername;

704          private String _sImperPassword;

705          private String _sImperDomain;

706          // 记录模拟上下文

707          private WindowsImpersonationContext _imperContext;

708          private IntPtr _adminToken;

709          private IntPtr _dupeToken;

710          // 是否已停止模拟

711          private Boolean _bClosed;

712 

713          ///

714          ///构造函数

715          ///

716          ///

717 所要模拟的用户的用户名 

718          ///

719 所要模拟的用户的密码 

720          ///

721 所要模拟的用户所在的域 

722          public IdentityImpersonation(String impersonationUsername, String impersonationPassword, String impersonationDomain) 

723          {

724               _sImperUsername = impersonationUsername;

725               _sImperPassword = impersonationPassword;

726               _sImperDomain = impersonationDomain;

727 

728               _adminToken = IntPtr.Zero;

729               _dupeToken = IntPtr.Zero;

730               _bClosed = true;

731          }

732 

733          ///

734          ///析构函数

735          ///

736          ~IdentityImpersonation() 

737          {

738               if(!_bClosed) 

739               {

740                    StopImpersonate();

741               }

742          }

743 

744          ///

745          ///开始身份角色模拟。

746          ///

747          ///

748          public Boolean BeginImpersonate() 

749          {

750               Boolean bLogined = LogonUser(_sImperUsername, _sImperDomain, _sImperPassword, 2, 0, ref _adminToken);

751                         

752               if(!bLogined) 

753               {

754                    return false;

755               }

756 

757               Boolean bDuped = DuplicateToken(_adminToken, 2, ref _dupeToken);

758 

759               if(!bDuped) 

760               {

761                    return false;

762               }

763 

764               WindowsIdentity fakeId = new WindowsIdentity(_dupeToken);

765               _imperContext = fakeId.Impersonate();

766 

767               _bClosed = false;

768 

769               return true;

770          }

771 

772          ///

773          ///停止身分角色模拟。

774          ///

775          public void StopImpersonate() 

776          {

777               _imperContext.Undo();

778               CloseHandle(_dupeToken);

779               CloseHandle(_adminToken);

780               _bClosed = true;

781          }

782      }

783 }

784 =====================================================

785 

786 简单的应用

787 

788 [WebMethod]

789   public string IsAuthenticated(string UserID,string Password)

790   {

791             string _path = "LDAP://" + adm + "/DC=lamda,DC=com,DC=cn";//"LDAP://172.75.200.1/DC=名字,DC=com,DC=cn";

792    string _filterAttribute=null;

793   

794    DirectoryEntry entry = new DirectoryEntry(_path,UserID,Password);

795    

796    try

797    {

798     //Bind to the native AdsObject to force authentication.

799     DirectorySearcher search = new DirectorySearcher(entry);

800     search.Filter = "(SAMAccountName=" + UserID + ")";

801     SearchResult result = search.FindOne();

802     

803     if(null == result)

804     {

805      _filterAttribute="登录失败: 未知的用户名或错误密码.";

806     }

807     else

808     {

809      _filterAttribute="true";

810     }

811    

812    }

813    catch (Exception ex)

814    {

815 //    if(ex.Message.StartsWith("该服务器不可操作")) 

816 //    {

817 //     string mail = ADO.GetConnString("mail");

818 //     entry.Path = "LDAP://"+mail+"/OU=名字,DC=it2004,DC=gree,DC=com,DC=cn";

819 //     try

820 //     { 

821 //      DirectorySearcher search = new DirectorySearcher(entry);

822 //      search.Filter = "(SAMAccountName=" + UserID + ")";

823 //      SearchResult result = search.FindOne();

824 //

825 //      if(null == result)

826 //      {

827 //       _filterAttribute="登录失败: 未知的用户名或错误密码.";

828 //      }

829 //      else

830 //      {

831 //       _filterAttribute="true";

832 //      }

833 //      return _filterAttribute;

834 //   

835 //     }

836 //     catch (Exception ex1)

837 //     {

838 //      return ex1.Message;

839 //     }

840 //     

841 //    }

842 //    else

843      return ex.Message;

844    }

845    return _filterAttribute;

846   }

847   [WebMethod]

848   public string[] LDAPMessage(string UserID)

849   {

850    string _path = "LDAP://"+adm+"/DC=it2004,DC=名字,DC=com,DC=cn";

851    string[] _filterAttribute=new string[5];

852    string[] msg = {"samaccountname","displayname","department","company"};

853 

854    DirectoryEntry entry = new DirectoryEntry(_path,"180037","790813");

855 

856    

857    try

858    { 

859 

860 

861     Object obj = entry.NativeObject;

862     

863     DirectorySearcher search = new DirectorySearcher(entry);

864     search.Filter = "(SAMAccountName=" + UserID + ")";

865     SearchResult result = search.FindOne();

866 

867     

868     if(null == result)

869     {

870      _filterAttribute[0]="登录失败: 未知的用户名或错误密码.";

871     }

872     else

873     {

874      _filterAttribute[0]="true";  

875      for(int propertyCounter = 1; propertyCounter < 5; propertyCounter++)

876      {

877        

878       if(propertyCounter==4 &&  result.Properties[msg[propertyCounter-1]][0]==null)

879        break;

880       _filterAttribute[propertyCounter]=result.Properties[msg[propertyCounter-1]][0].ToString();

881       

882      }

883     }

884    

885    }

886    catch (Exception ex)

887    {

888     //_filterAttribute[0]=ex.Message;

889    }

890    return _filterAttribute;

891   }

892   [WebMethod]

893   public string[] AllMembers() 

894   {

895    

896    string[] msg;

897    string _path = "LDAP://名字";

898 

899    DirectoryEntry entry = new DirectoryEntry(_path,"180037","790813");

900    

901 

902    //Bind to the native AdsObject to force authentication.

903    Object obj = entry.NativeObject;

904 

905    System.DirectoryServices.DirectorySearcher mySearcher = new System.DirectoryServices.DirectorySearcher(entry);

906    mySearcher.Filter = "(SAMAccountName=180037)";

907    msg=new string[mySearcher.FindAll().Count];

908    int i=0;

909    foreach(System.DirectoryServices.SearchResult result in mySearcher.FindAll()) 

910    {

911     msg[i++]=result.Path;

912    }

913    return msg;

914   }

915 

916 }

 

你可能感兴趣的:(C#)