/[projects]/dao/DelphiScanner/Components/tpsystools_4.04/source/StNet.pas
ViewVC logotype

Contents of /dao/DelphiScanner/Components/tpsystools_4.04/source/StNet.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2671 - (show annotations) (download)
Tue Aug 25 18:15:15 2015 UTC (8 years, 9 months ago) by torben
File size: 105794 byte(s)
Added tpsystools component
1 // Upgraded to Delphi 2009: Sebastian Zierer
2
3 (* ***** BEGIN LICENSE BLOCK *****
4 * Version: MPL 1.1
5 *
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 1.1 (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 * http://www.mozilla.org/MPL/
10 *
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
14 * License.
15 *
16 * The Original Code is TurboPower SysTools
17 *
18 * The Initial Developer of the Original Code is
19 * TurboPower Software
20 *
21 * Portions created by the Initial Developer are Copyright (C) 1996-2002
22 * the Initial Developer. All Rights Reserved.
23 *
24 * Contributor(s):
25 *
26 * ***** END LICENSE BLOCK ***** *)
27
28 {*********************************************************}
29 {* SysTools: StNet.pas 4.04 *}
30 {*********************************************************}
31 {* SysTools: Base Unit for Network Components *}
32 {*********************************************************}
33
34 {$I StDefine.inc}
35
36 {$H+} {Huge strings}
37
38 unit StNet;
39
40 interface
41
42 uses
43 Windows, Classes, StBase, StDate, StNetApi, StConst;
44
45 type
46 TStNetItemType = (nitUnknown, nitLocalUser, nitGlobalUser, nitLocalGroup,
47 nitGlobalGroup, nitComputer, nitInterdomainTrust,
48 nitWorkstationTrust, nitServerTrust, nitShare);
49
50 TStNetSidType = (nstNone, nstUser, nstGroup, nstDomain, nstAlias,
51 nstWellKnownGroup, nstDeletedAccount, nstInvalid, nstUnknown,
52 nstComputer);
53
54 TStNetUserPrivType = (uptUnknown, uptGuest, uptUser, uptAdmin);
55 TStNetUserAuthPrivType = (uaptPrint, uaptCommunications, uaptServer,
56 uaptAccounts);
57 TStNetUserAuthPrivSet = set of TStNetUserAuthPrivType;
58
59 TStNetShareType = (stUnknown, stDisk, stPrint, stDevice, stIPC, stSpecial);
60
61 TStNetServerPlatformType = (sptUnknown, sptDOS, sptOS2, sptNT, sptOSF, sptVMS);
62
63 TStNetServerType = (nsvtWorkstation, nsvtServer, nsvtSQLServer, nsvtDomainCtrl,
64 nsvtDomainBackupCtrl, nsvtTimeSource, nsvtAFP, nsvtNovell,
65 nsvtDomainMember, nsvtPrintQServer, nsvtDialinServer,
66 nsvtUNIXServer, nsvtNT, nsvtWFW, nsvtMFPN, nsvtServerNT,
67 nsvtPotentialBrowser, nsvtBackupBrowser, nsvtMasterBrowser,
68 nsvtDomainMaster, nsvtOSF, nsvtVMS, nsvtWindows,
69 nsvtDFS, nsvtClusterNT, nsvtTerminalServer, nsvtDCE,
70 nsvtAlternateXPORT, nsvtLocalListOnly, nsvtDomainEnum);
71
72 TStNetServerSet = set of TStNetServerType;
73
74 TStNetUserLogonTimes = array[TStDayType] of array[0..23] of Boolean;
75
76 TStNetServerRoleType = (srtUnknown, srtStandAlone, srtMember, srtBackup,
77 strPrimary);
78
79 TStNetwork = class;
80
81 TStSidRecord = record
82 Value : Pointer;
83 ValueS: string;
84 Length: DWord;
85 Usage : TStNetSidType;
86 end;
87
88 TStNetItem = class(TObject)
89 private
90 FNetwork : TStNetwork;
91 FItemType: TStNetItemType;
92 FName : string;
93 FServer : string;
94 protected
95 FComment : string;
96 constructor CreateEx(AName, AComment, AServer:
97 string; AItemType: TStNetItemType);
98 public
99 constructor Create;
100 destructor Destroy; override;
101
102 property Comment : string
103 read FComment;
104 property ItemType: TStNetItemType
105 read FItemType;
106 property Name : string
107 read FName;
108 property Server : string
109 read FServer;
110 end;
111
112 TStNetUserItem = class(TStNetItem)
113 private
114 FFullName : string;
115 FID : Cardinal;
116 FGroupList: TStrings;
117 FUserData : Pointer;
118 FSidRecord: TStSidRecord;
119 FDomain : string;
120 FWorkStationList : TStrings;
121 protected
122 function GetAccountDisabled : Boolean;
123 function GetAccountExpires : TStDateTimeRec;
124 function GetBadPasswordCount : Cardinal;
125 function GetDomain : string;
126 function GetFullName : string;
127 function GetGroupItemList : TStringList;
128 function GetHomeDirectory : string;
129 function GetHomeDrive : string;
130 function GetLastLogon : TStDateTimeRec;
131 function GetLastLogoff : TStDateTimeRec;
132 function GetLockedOut : Boolean;
133 function GetName : string;
134 function GetNoUserPasswordChange : Boolean;
135 function GetNumberOfLogons : Cardinal;
136 function GetOperatorPrivilege : TStNetUserAuthPrivSet;
137 function GetPasswordNeverExpires : Boolean;
138 function GetPasswordExpired : Boolean;
139 function GetPasswordLastChanged : TStDateTimeRec;
140 function GetPasswordNotRequired : Boolean;
141 function GetPrimaryGroup : TStNetItem;
142 function GetProfilePath : string;
143 function GetSid : TStSidRecord;
144 function GetScriptPath : string;
145 function GetUserComment : string;
146 function GetUserPrivilege : TStNetUserPrivType;
147 function GetWorkstations : TStrings;
148
149 procedure SetAccountDisabled(Value: Boolean);
150 procedure SetAccountExpires(Value: TStDateTimeRec);
151 procedure SetComment(Value: string);
152 procedure SetFullName(Value: string);
153 procedure SetHomeDirectory(Value: string);
154 procedure SetHomeDrive(Value: string);
155 procedure SetLockedOut(Value: Boolean);
156 procedure SetName(Value: string);
157 procedure SetNoUserPasswordChange(Value: Boolean);
158 procedure SetPasswordAdmin(Value: string);
159 procedure SetPasswordNeverExpires(Value: Boolean);
160 procedure SetPasswordExpired(Value: Boolean);
161 procedure SetPasswordNotRequired(Value: Boolean);
162 procedure SetPrimaryGroup(Value: TStNetItem);
163 procedure SetProfilePath(Value: string);
164 procedure SetScriptPath(Value: string);
165 procedure SetUserComment(Value: string);
166 procedure SetWorkstations(Value: TStrings);
167
168 constructor CreateEx(AName, AComment, AServer: string;
169 AItemType: TStNetItemType);
170 constructor CreateExEnum(AName, AComment, AServer, AFullName: string;
171 AGlobal: Boolean; AID: Cardinal);
172 public
173 destructor Destroy; override;
174 procedure Delete;
175 procedure Refresh;
176 procedure AddToGroup(AGroup: TStNetItem);
177 procedure RemoveFromGroup(AGroup: TStNetItem);
178
179 procedure GetLogonHours(var LogonHours: TStNetUserLogonTimes);
180 procedure SetLogonHours(LogonHours: TStNetUserLogonTimes);
181 procedure SetPassword(OldPassword, NewPassword: string);
182
183 property AccountDisabled : Boolean
184 read GetAccountDisabled write SetAccountDisabled;
185 property AccountExpires : TStDateTimeRec
186 read GetAccountExpires write SetAccountExpires;
187 property BadPasswordCount : Cardinal
188 read GetBadPasswordCount;
189 property Comment : string
190 read FComment write SetComment;
191 property Domain : string
192 read GetDomain;
193 property FullName : string
194 read GetFullName write SetFullName;
195 property Groups : TStringList
196 read GetGroupItemList;
197 property HomeDirectory : string
198 read GetHomeDirectory write SetHomeDirectory;
199 property HomeDrive : string
200 read GetHomeDrive write SetHomeDrive;
201 property ID : Cardinal
202 read FID;
203 property LastLogon : TStDateTimeRec
204 read GetLastLogon;
205 property LastLogoff : TStDateTimeRec
206 read GetLastLogoff;
207 property LockedOut : Boolean
208 read GetLockedOut write SetLockedOut;
209 property Name : string
210 read GetName write SetName;
211 property NoUserPasswordChange: Boolean
212 read GetNoUserPasswordChange write SetNoUserPasswordChange;
213 property NumberOfLogons : Cardinal
214 read GetNumberOfLogons;
215 property OperatorPrivilege : TStNetUserAuthPrivSet
216 read GetOperatorPrivilege;
217 property Password : string
218 write SetPasswordAdmin;
219 property PasswordNeverExpires: Boolean
220 read GetPasswordNeverExpires write SetPasswordNeverExpires;
221 property PasswordExpired : Boolean
222 read GetPasswordExpired write SetPasswordExpired;
223 property PasswordLastChanged : TStDateTimeRec
224 read GetPasswordLastChanged;
225 property PasswordNotRequired : Boolean
226 read GetPasswordNotRequired write SetPasswordNotRequired;
227 property PrimaryGroup : TStNetItem
228 read GetPrimaryGroup write SetPrimaryGroup;
229 property ProfilePath : string
230 read GetProfilePath write SetProfilePath;
231 property ScriptPath : string
232 read GetScriptPath write SetScriptPath;
233 property Sid : TStSidRecord
234 read GetSid;
235 property UserComment : string
236 read GetUserComment write SetUserComment;
237 property UserPrivilege : TStNetUserPrivType
238 read GetUserPrivilege;
239 property Workstations : TStrings
240 read GetWorkstations write SetWorkstations;
241 end;
242
243 TStNetGroupItem = class(TStNetItem)
244 private
245 FID : Cardinal;
246 FItemList : TStrings;
247 FSidRecord: TStSidRecord;
248 FDomain : string;
249 protected
250 constructor CreateEx(AName, AComment, AServer: string;
251 AItemType: TStNetItemType);
252 constructor CreateExEnum(AName, AComment, AServer: string; AID: Cardinal);
253
254 function GetGroupItemList: TStringList;
255 function GetDomain: string;
256 function GetSid: TStSidRecord;
257 function GetName: string;
258
259 procedure SetComment(Value: string);
260 procedure SetName(Value: string);
261 public
262 destructor Destroy; override;
263
264 procedure AddToGroup(AItem: TStNetItem);
265 procedure RemoveFromGroup(AItem: TStNetItem);
266 procedure Delete;
267 procedure Refresh;
268
269 property Comment : string read FComment write SetComment;
270 property Name : string read GetName write SetName;
271 property ID : Cardinal read FID;
272 property Items : TStringList read GetGroupItemList;
273 property Sid : TStSidRecord read GetSid;
274 property Domain : string read GetDomain;
275 end;
276
277 TStNetShareItem = class(TStNetItem)
278 private
279 FShareType : TStNetShareType;
280 protected
281 constructor CreateEx(AName, AComment, AServer: string;
282 AShareType: TStNetShareType);
283 public
284 property ShareType : TStNetShareType read FShareType;
285 end;
286
287 TStNetServerItem = class(TStNetItem)
288 private
289 FUserList : TStringList;
290 FGroupList : TStringList;
291 FDriveList : TStringList;
292 FShareList : TStringList;
293 FServerData : Pointer;
294 FServerMData0: Pointer;
295 FServerMData1: Pointer;
296 FServerMData2: Pointer;
297 FServerMData3: Pointer;
298 protected
299 constructor CreateEx(AName, AComment: string);
300
301 function GetUser(AName: string): TStNetUserItem;
302 function GetGroup(AName: string): TStNetGroupItem;
303
304 function GetDriveList: TStringList;
305 function GetUserList: TStringList;
306 function GetGroupList : TStringList;
307 function GetShareList : TStringList;
308
309 procedure SetComment(Value: string);
310
311 function GetAnnounceRate: DWord;
312 function GetAnnounceRateDelta: DWord;
313 function GetDisconnectTime: DWord;
314 function GetMaxUsers: DWord;
315 function GetPlatform: TStNetServerPlatformType;
316 function GetServerType: TStNetServerSet;
317 function GetUserPath: string;
318 function GetVisible: Boolean;
319 function GetVersion: DWord;
320
321 function GetMinPasswordLen: DWord;
322 function GetMaxPasswordAge: DWord;
323 function GetMinPasswordAge: DWord;
324 function GetForceLogoff: TStTime;
325 function GetPasswordHistoryLength: DWord;
326 function GetRole: TStNetServerRoleType;
327 function GetPrimaryDC: string;
328 function GetDomainName: string;
329 function GetDomainSid : TStSidRecord;
330 function GetLockOutDuration : DWord;
331 function GetLockoutObservationWindow: DWord;
332 function GetLockoutThreshold: DWord;
333
334 procedure SetMinPasswordLen(Value: DWord);
335 procedure SetMaxPasswordAge(Value: DWord);
336 procedure SetMinPasswordAge(Value: DWord);
337 procedure SetForceLogoff(Value: TStTime);
338 procedure SetPasswordHistoryLength(Value: DWord);
339 procedure SetLockOutDuration(Value: DWord);
340 procedure SetLockoutObservationWindow(Value: DWord);
341 procedure SetLockoutThreshold(Value: DWord);
342
343 procedure SetAnnounceRate(Value: DWord);
344 procedure SetAnnounceRateDelta(Value: DWord);
345 procedure SetDisconnectTime(Value: DWord);
346 procedure SetMaxUsers(Value: DWord);
347 procedure SetVisible(Value: Boolean);
348
349 procedure RefreshM0;
350 procedure RefreshM1;
351 procedure RefreshM2;
352 procedure RefreshM3;
353 public
354 destructor Destroy; override;
355
356 function AddGroup(AName, ADescription: string; AGlobal: Boolean): TStNetGroupItem;
357 function AddUser(AName, APassword: string; AGlobal: Boolean): TStNetUserItem;
358 procedure Refresh;
359
360 property AnnounceRate : DWord
361 read GetAnnounceRate write SetAnnounceRate;
362 property AnnounceRateDelta : DWord
363 read GetAnnounceRateDelta write SetAnnounceRateDelta;
364 property Comment : string
365 read FComment write SetComment;
366 property DisconnectTime : DWord
367 read GetDisconnectTime write SetDisconnectTime;
368 property MaxUsers : DWord
369 read GetMaxUsers write SetMaxUsers;
370 property Platform : TStNetServerPlatformType
371 read GetPlatform;
372 property ServerType : TStNetServerSet
373 read GetServerType;
374 property UserPath : string
375 read GetUserPath;
376 property Version : DWord
377 read GetVersion;
378 property Visible : Boolean
379 read GetVisible write SetVisible;
380
381 { MODALS_INFO_0 }
382 property MinPasswordLen : DWord
383 read GetMinPasswordLen write SetMinPasswordLen;
384 property MaxPasswordAge : DWord
385 read GetMaxPasswordAge write SetMaxPasswordAge;
386 property MinPasswordAge : DWord
387 read GetMinPasswordAge write SetMinPasswordAge;
388 property ForceLogoff : TStTime
389 read GetForceLogoff write SetForceLogoff;
390 property PasswordHistoryLength : DWord
391 read GetPasswordHistoryLength write SetPasswordHistoryLength;
392
393 { MODALS_INFO_1 }
394 property Role : TStNetServerRoleType
395 read GetRole;
396 property PrimaryDC : string
397 read GetPrimaryDC;
398
399 { MODALS_INFO_2 }
400 property DomainName : string
401 read GetDomainName;
402 property DomainSid : TStSidRecord
403 read GetDomainSid;
404
405 { MODALS_INFO_3 }
406 property LockOutDuration : DWord
407 read GetLockOutDuration write SetLockOutDuration;
408 property LockoutObservationWindow: DWord
409 read GetLockoutObservationWindow write SetLockoutObservationWindow;
410 property LockoutThreshold : DWord
411 read GetLockoutThreshold write SetLockoutThreshold;
412
413 property User[AName: string] : TStNetUserItem
414 read GetUser;
415 property Group[AName: string] : TStNetGroupItem
416 read GetGroup;
417 property Drives : TStringList
418 read GetDriveList;
419 property Users: TStringList
420 read GetUserList;
421 property Groups: TStringList
422 read GetGroupList;
423 property Shares: TStringList
424 read GetShareList;
425 end;
426
427 TStNetwork = class(TObject)
428 private
429 FList : TStringList;
430 protected
431 function GetServer(AServer: string): TStNetServerItem;
432 function GetUser(AServer, AName: string): TStNetUserItem;
433 function GetGroup(AServer, AName: string): TStNetGroupItem;
434 function GetPrimaryDC(ADomain: string): TStNetServerItem;
435 public
436 constructor Create;
437 destructor Destroy; override;
438
439 property Server[AServer: string] : TStNetServerItem
440 read GetServer;
441 property User[AServer, AName: string]: TStNetUserItem
442 read GetUser;
443 property Group[AServer, AName: string]: TStNetGroupItem
444 read GetGroup;
445 property PrimaryDC[ADomain: string] : TStNetServerItem
446 read GetPrimaryDC;
447 end;
448
449 var
450 StNetwork : TStNetwork;
451
452 implementation
453
454 uses SysUtils, StUtils, StSystem, StStrL;
455
456 { --- TStNetItem ------------------------------------------------------------ }
457 constructor TStNetItem.Create;
458 begin
459 { don't allow manual creation of this object }
460 RaiseStError(EStNetException, stscNetNoManualCreate);
461 end;
462
463 constructor TStNetItem.CreateEx(AName, AComment, AServer: string;
464 AItemType: TStNetItemType);
465 begin
466 inherited Create;
467 FName := AName;
468 FComment := AComment;
469 FServer := AServer;
470 FItemType := AItemType;
471 FNetwork := nil;
472 end;
473
474 destructor TStNetItem.Destroy;
475 begin
476 inherited Destroy;
477 end;
478
479 { --- TStNetUserItem -------------------------------------------------------- }
480
481 constructor TStNetUserItem.CreateEx(AName, AComment, AServer: string;
482 AItemType: TStNetItemType);
483 var
484 ErrorD : DWord;
485 Flags : DWord;
486 begin
487 inherited CreateEx(AName, AComment, AServer, AItemType);
488 FGroupList := TStringList.Create;
489 FUserData := nil;
490
491 { need to find out what type of user this is }
492 if (AItemType = nitUnknown) then begin
493 ErrorD := StNetUserGetInfo(FServer, FName, 3, FUserData);
494 if ErrorD = NERR_SUCCESS then begin
495 Flags := TUSER_INFO_3(FUserData^).usri3_flags;
496 if LongFlagIsSet(Flags, UF_TEMP_DUPLICATE_ACCOUNT) then
497 FItemType := nitLocalUser
498 else if LongFlagIsSet(Flags, UF_NORMAL_ACCOUNT) then
499 FItemType := nitGlobalUser
500 else if LongFlagIsSet(Flags, UF_INTERDOMAIN_TRUST_ACCOUNT) then
501 FItemType := nitInterdomainTrust
502 else if LongFlagIsSet(Flags, UF_WORKSTATION_TRUST_ACCOUNT) then
503 FItemType := nitWorkstationTrust
504 else if LongFlagIsSet(Flags, UF_SERVER_TRUST_ACCOUNT) then
505 FItemType := nitServerTrust;
506
507 FComment := TUSER_INFO_3(FUserData^).usri3_comment;
508 FID := TUSER_INFO_3(FUserData^).usri3_user_id;
509 FFullName:= TUSER_INFO_3(FUserData^).usri3_full_name;
510 end else begin
511 RaiseStWin32Error(EStNetException, ErrorD);
512 end;
513 end;
514 end;
515
516 constructor TStNetUserItem.CreateExEnum(AName, AComment, AServer,
517 AFullName: string; AGlobal: Boolean;
518 AID: Cardinal);
519 begin
520 inherited CreateEx(AName, AComment, AServer, nitUnknown);
521 FGroupList := TStringList.Create;
522
523 FFullName := AFullName;
524 FID := AID;
525
526 if AGlobal then
527 FItemType := nitGlobalUser
528 else
529 FItemType := nitLocalUser;
530 end;
531
532 destructor TStNetUserItem.Destroy;
533 begin
534 FGroupList.Free;
535
536 if (FSidRecord.Value <> nil) then
537 StNetApiBufferFree(FSidRecord.Value);
538
539 if (FUserData <> nil) then
540 StNetApiBufferFree(FUserData);
541
542 inherited Destroy;
543 end;
544
545 function TStNetUserItem.GetGroupItemList: TStringList;
546 var
547 NewList : TStringList;
548 ErrorD : DWord;
549 Index : Integer;
550 Buffer : Pointer;
551 EntriesRead : DWord;
552 TotalEntries : DWord;
553 S : TStNetServerItem;
554 NewItem : TStNetGroupItem;
555 CurrentName : string;
556 begin
557 NewList := TStringList.Create;
558 try
559 { get the list of global groups that this user belongs to }
560 ErrorD := StNetUserGetGroups(FServer, FName, 0, Buffer, DWord(-1),
561 EntriesRead, TotalEntries);
562 if ErrorD = NERR_SUCCESS then begin
563 try
564 if EntriesRead > 0 then begin {!!.02}
565 for Index := 0 to EntriesRead-1 do begin
566 CurrentName := TGroupUsersInfo0Array(Buffer^)[Index].grui0_name;
567 { does this group already exist in the servers list of groups }
568 NewItem := nil;
569 if (FNetwork <> nil) then begin
570 S := FNetwork.Server[FServer];
571 NewItem := S.Group[CurrentName];
572 NewItem.FItemType := nitGlobalGroup;
573 end;
574
575 if (NewItem = nil) then begin
576 NewItem := TStNetGroupItem.CreateEx(CurrentName, '', FServer,
577 nitGlobalGroup);
578 NewItem.FNetwork := FNetwork;
579 end;
580 NewList.AddObject(CurrentName, NewItem);
581 end;
582 end; {!!.02}
583 finally
584 StNetApiBufferFree(Buffer);
585 Buffer := nil;
586 end;
587 end else begin
588 RaiseStWin32Error(EStNetException, ErrorD);
589 end;
590
591 { get the list of local groups that this user belongs to }
592 ErrorD := StNetUserGetLocalGroups(FServer, FName, 0, 0, Buffer,
593 DWord(-1), EntriesRead, TotalEntries);
594 if ErrorD = NERR_SUCCESS then begin
595 try
596 if EntriesRead > 0 then begin {!!.02}
597 for Index := 0 to EntriesRead-1 do begin
598 CurrentName := TLocalGroupUsersInfo0Array(Buffer^)[Index].lgrui0_name;
599 { does this group already exist in the servers list of groups }
600 NewItem := nil;
601 if (FNetwork <> nil) then begin
602 S := FNetwork.Server[FServer];
603 NewItem := S.Group[CurrentName];
604 NewItem.FItemType := nitLocalGroup;
605 end;
606
607 if (NewItem = nil) then begin
608 NewItem := TStNetGroupItem.CreateEx(CurrentName, '', FServer,
609 nitLocalGroup);
610 NewItem.FNetwork := FNetwork;
611 end;
612 NewList.AddObject(CurrentName, NewItem);
613 end;
614 end; {!!.02}
615 finally
616 StNetApiBufferFree(Buffer);
617 Buffer := nil;
618 end;
619 end else begin
620 RaiseStWin32Error(EStNetException, ErrorD);
621 end;
622
623 FGroupList.Assign(NewList);
624 finally
625 NewList.Free;
626 end;
627 Result := FGroupList as TStringList
628 end;
629
630 function TStNetUserItem.GetPrimaryGroup: TStNetItem;
631 var
632 GList : TStringList;
633 I : Integer;
634 begin
635 GList := Groups;
636 Result := nil;
637 for I := 0 to GList.Count -1 do begin
638 if TStNetGroupItem(GList.Objects[I]).ID = TUSER_INFO_3(FUserData^).usri3_primary_group_id then begin
639 Result := TStNetItem(GList.Objects[I]);
640 Exit;
641 end;
642 end;
643 end;
644
645 function TStNetUserItem.GetDomain: string;
646 begin
647 if (FSidRecord.Value = nil) then begin
648 FSidRecord := GetSid;
649 end;
650 Result := FDomain;
651 end;
652
653 function TStNetUserItem.GetSid: TStSidRecord;
654 var
655 NoError: Boolean;
656 _SidUse: DWord;
657 Index : Integer;
658 begin
659 if (FSidRecord.Value = nil) then begin
660 NoError := StLookupAccountName(FServer, FName, FSidRecord.Value,
661 FSidRecord.Length, FDomain, _SidUse);
662 if NoError then begin
663 { and the SID usage flag to the enumeration }
664 FSidRecord.Usage := TStNetSidType(_SidUse);
665
666 { convert the sid to a readable string }
667 FSidRecord.ValueS :=
668 Format('S-1-%d',
669 [TSIDIdentifierAuthority(
670 StGetSidIdentifierAuthority(FSidRecord.Value)^).Value[5]]);
671
672 for Index := 0 to StGetSidSubAuthorityCount(FSidRecord.Value) - 1 do begin
673 FSidRecord.ValueS :=
674 Format(FSidRecord.ValueS + '-%d', [StGetSidSubAuthority(
675 FSidRecord.Value, Index)]);
676 end;
677 end else begin
678 RaiseStWin32Error(EStNetException, GetLastError);
679 end;
680 end;
681 Result := FSidRecord;
682 end;
683
684 procedure TStNetUserItem.Refresh;
685 var
686 ErrorD : DWord;
687 Buffer : Pointer;
688 begin
689 { get the account name, comment and ID for the item }
690 ErrorD := StNetUserGetInfo(FServer, FName, 3, Buffer);
691 if ErrorD = NERR_SUCCESS then begin
692 StNetApiBufferFree(FUserData);
693 FUserData := Buffer;
694
695 FComment := TUSER_INFO_3(FUserData^).usri3_comment;
696 FID := TUSER_INFO_3(FUserData^).usri3_user_id;
697
698 if LongFlagIsSet(TUSER_INFO_3(FUserData^).usri3_flags, UF_NORMAL_ACCOUNT) then
699 FItemType := nitGlobalUser
700 else if LongFlagIsSet(TUSER_INFO_3(FUserData^).usri3_flags, UF_TEMP_DUPLICATE_ACCOUNT) then
701 FItemType := nitLocalUser
702 else
703 FItemType := nitUnknown;
704 end else begin
705 RaiseStWin32Error(EStNetException, ErrorD);
706 end;
707 end;
708
709 procedure TStNetUserItem.AddToGroup(AGroup : TStNetItem);
710 var
711 ErrorD : DWord;
712 begin
713 if AGroup.ItemType = nitGlobalGroup then begin
714 ErrorD := StNetGroupAddUser(AGroup.Server, AGroup.Name, FName);
715 if ErrorD = NERR_SUCCESS then begin
716 if FGroupList.IndexOf(AGroup.Name) < 0 then
717 FGroupList.AddObject(AGroup.Name, AGroup);
718 end else begin
719 RaiseStWin32Error(EStNetException, ErrorD);
720 end;
721 end else if AGroup.ItemType = nitLocalGroup then begin
722 ErrorD := StNetLocalGroupAddMembers(FServer, AGroup.Name, 0, Sid.Value, 1);
723 if ErrorD = NERR_SUCCESS then begin
724 if FGroupList.IndexOf(AGroup.Name) < 0 then
725 FGroupList.AddObject(AGroup.Name, AGroup);
726 end else begin
727 RaiseStWin32Error(EStNetException, ErrorD);
728 end;
729 end else begin
730 RaiseStError(EStNetException, stscNetGroupNotSpecified);
731 end;
732 end;
733
734 procedure TStNetUserItem.RemoveFromGroup(AGroup: TStNetItem);
735 var
736 ErrorD : DWord;
737 begin
738 if AGroup.ItemType = nitGlobalGroup then begin
739 ErrorD := StNetGroupDelUser(FServer, AGroup.Name, FName);
740 if ErrorD = NERR_SUCCESS then begin
741 FGroupList.Delete(FGroupList.IndexOf(AGroup.Name));
742 end else begin
743 RaiseStWin32Error(EStNetException, ErrorD);
744 end;
745 end else if AGroup.ItemType = nitLocalGroup then begin
746 ErrorD := StNetLocalGroupDelMembers(AGroup.Server, AGroup.Name, 0, Sid.Value, 1);
747 if ErrorD = NERR_SUCCESS then begin
748 FGroupList.Delete(FGroupList.IndexOf(AGroup.Name));
749 end else begin
750 RaiseStWin32Error(EStNetException, ErrorD);
751 end;
752 end else begin
753 RaiseStError(EStNetException, stscNetGroupNotSpecified);
754 end;
755 end;
756
757 procedure TStNetUserItem.Delete;
758 { removes this user from the server }
759 var
760 ErrorD : DWord;
761 S : TStNetServerItem;
762 begin
763 { remove from the server }
764 ErrorD := StNetUserDel(FServer, FName);
765 if ErrorD = NERR_SUCCESS then begin
766 if FNetwork <> nil then begin
767 S := FNetwork.Server[FServer];
768 S.FUserList.Objects[S.FUserList.IndexOf(FName)] := nil;
769 S.FUserList.Delete(S.FUserList.IndexOf(FName));
770 end;
771 Free;
772 end else begin
773 RaiseStWin32Error(EStNetException, ErrorD);
774 end;
775 end;
776
777 function TStNetUserItem.GetAccountDisabled: Boolean;
778 var
779 Data : DWord;
780 begin
781 if (FUserData = nil) then
782 Refresh;
783 Data := TUSER_INFO_3(FUserData^).usri3_flags;
784 Result := LongFlagIsSet(Data, UF_ACCOUNTDISABLE);
785 end;
786
787 function TStNetUserItem.GetAccountExpires: TStDateTimeRec;
788 var
789 Data : DWord;
790 begin
791 if (FUserData = nil) then
792 Refresh;
793 Data := TUSER_INFO_3(FUserData^).usri3_acct_expires;
794 if Data = TIMEQ_FOREVER then begin
795 Result.D := 0;
796 Result.T := 0;
797 end else
798 Result := GlobalDateTimeToLocal(UnixTimeToStDateTime(Data), 0);
799 end;
800
801 function TStNetUserItem.GetBadPasswordCount: Cardinal;
802 begin
803 if (FUserData = nil) then
804 Refresh;
805 Result := TUSER_INFO_3(FUserData^).usri3_bad_pw_count;
806 end;
807
808 function TStNetUserItem.GetFullName: string;
809 begin
810 if (FUserData = nil) then
811 Refresh;
812 Result := TUSER_INFO_3(FUserData^).usri3_full_name;
813 end;
814
815 function TStNetUserItem.GetHomeDirectory: string;
816 begin
817 if (FUserData = nil) then
818 Refresh;
819 Result := TUSER_INFO_3(FUserData^).usri3_home_dir;
820 end;
821
822 function TStNetUserItem.GetHomeDrive: string;
823 begin
824 if (FUserData = nil) then
825 Refresh;
826 Result := TUSER_INFO_3(FUserData^).usri3_home_dir_drive;
827 end;
828
829 function TStNetUserItem.GetLastLogon: TStDateTimeRec;
830 var
831 Data : DWord;
832 begin
833 if (FUserData = nil) then
834 Refresh;
835 Data := TUSER_INFO_3(FUserData^).usri3_last_logon;
836 Result := UnixTimeToStDateTime(Data);
837 end;
838
839 function TStNetUserItem.GetLastLogoff: TStDateTimeRec;
840 var
841 Data : DWord;
842 begin
843 if (FUserData = nil) then
844 Refresh;
845 Data := TUSER_INFO_3(FUserData^).usri3_last_logoff;
846 Result := UnixTimeToStDateTime(Data);
847 end;
848
849 function TStNetUserItem.GetLockedOut: Boolean;
850 var
851 Data : DWord;
852 begin
853 if (FUserData = nil) then
854 Refresh;
855 Data := TUSER_INFO_3(FUserData^).usri3_flags;
856 Result := LongFlagIsSet(Data, UF_LOCKOUT);
857 end;
858
859 function TStNetUserItem.GetName: string;
860 begin
861 Result := FName;
862 end;
863
864 function TStNetUserItem.GetNoUserPasswordChange: Boolean;
865 var
866 Data : DWord;
867 begin
868 if (FUserData = nil) then
869 Refresh;
870 Data := TUSER_INFO_3(FUserData^).usri3_flags;
871 Result := LongFlagIsSet(Data, UF_PASSWD_CANT_CHANGE);
872 end;
873
874 function TStNetUserItem.GetNumberOfLogons: Cardinal;
875 begin
876 if (FUserData = nil) then
877 Refresh;
878 Result := TUSER_INFO_3(FUserData^).usri3_num_logons;
879 end;
880
881 function TStNetUserItem.GetOperatorPrivilege: TStNetUserAuthPrivSet;
882 var
883 Data : DWord;
884 begin
885 if (FUserData = nil) then
886 Refresh;
887 Data := TUSER_INFO_3(FUserData^).usri3_auth_flags;
888 Result := [];
889 if LongFlagIsSet(Data, AF_OP_PRINT) then
890 Include(Result, uaptPrint);
891 if LongFlagIsSet(Data, AF_OP_COMM) then
892 Include(Result, uaptCommunications);
893 if LongFlagIsSet(Data, AF_OP_SERVER) then
894 Include(Result, uaptServer);
895 if LongFlagIsSet(Data, AF_OP_ACCOUNTS) then
896 Include(Result, uaptAccounts);
897 end;
898
899 function TStNetUserItem.GetPasswordNeverExpires: Boolean;
900 var
901 Data : DWord;
902 begin
903 if (FUserData = nil) then
904 Refresh;
905 Data := TUSER_INFO_3(FUserData^).usri3_flags;
906 Result := LongFlagIsSet(Data, UF_DONT_EXPIRE_PASSWD);
907 end;
908
909 function TStNetUserItem.GetPasswordExpired: Boolean;
910 begin
911 if (FUserData = nil) then
912 Refresh;
913 Result := Boolean(TUSER_INFO_3(FUserData^).usri3_password_expired);
914 end;
915
916 function TStNetUserItem.GetPasswordLastChanged: TStDateTimeRec;
917 var
918 Current:TStDateTimeRec;
919 Data : DWord;
920 begin
921 if (FUserData = nil) then
922 Refresh;
923 Current.D := CurrentDate;
924 Current.T := CurrentTime;
925 Data := TUSER_INFO_3(FUserData^).usri3_password_age;
926 IncDateTime(Current, Result, -Abs(Data div SecondsInDay),
927 -Abs(Data mod SecondsInDay));
928 end;
929
930 function TStNetUserItem.GetPasswordNotRequired: Boolean;
931 var
932 Data : DWord;
933 begin
934 if (FUserData = nil) then
935 Refresh;
936 Data := TUSER_INFO_3(FUserData^).usri3_flags;
937 Result := LongFlagIsSet(Data, UF_PASSWD_NOTREQD);
938 end;
939
940 function TStNetUserItem.GetProfilePath: string;
941 begin
942 if (FUserData = nil) then
943 Refresh;
944 Result := TUSER_INFO_3(FUserData^).usri3_profile;
945 end;
946
947 function TStNetUserItem.GetScriptPath: string;
948 begin
949 if (FUserData = nil) then
950 Refresh;
951 Result := TUSER_INFO_3(FUserData^).usri3_script_path;
952 end;
953
954 function TStNetUserItem.GetUserComment: string;
955 begin
956 if (FUserData = nil) then
957 Refresh;
958 Result := TUSER_INFO_3(FUserData^).usri3_usr_comment;
959 end;
960
961 function TStNetUserItem.GetUserPrivilege: TStNetUserPrivType;
962 var
963 Data : DWord;
964 begin
965 if (FUserData = nil) then
966 Refresh;
967 Data := TUSER_INFO_3(FUserData^).usri3_priv;
968 Result := TStNetUserPrivType(Data+1);
969 end;
970
971 function TStNetUserItem.GetWorkstations: TStrings;
972 var
973 Data: string;
974 begin
975 if (FUserData = nil) then
976 Refresh;
977 Data := TUSER_INFO_3(FUserData^).usri3_workstations;
978 FWorkStationList.CommaText := Data;
979 Result := FWorkStationList;
980 end;
981
982 procedure TStNetUserItem.SetAccountDisabled(Value: Boolean);
983 var
984 Data : DWord;
985 ErrorD : DWord;
986 ParmErr : DWord;
987 begin
988 if Value <> AccountDisabled then begin
989 Data := TUSER_INFO_3(FUserData^).usri3_flags;
990 if Value then
991 SetLongFlag(LongInt(Data), UF_ACCOUNTDISABLE)
992 else
993 ClearLongFlag(LongInt(Data), UF_ACCOUNTDISABLE);
994
995 ErrorD := StNetUserSetInfo(FServer, FName, 1008, @Data, ParmErr);
996 if ErrorD = NERR_SUCCESS then
997 TUSER_INFO_3(FUserData^).usri3_flags := Data
998 else
999 RaiseStWin32Error(EStNetException, ErrorD);
1000 end;
1001 end;
1002
1003 procedure TStNetUserItem.SetAccountExpires(Value: TStDateTimeRec);
1004 var
1005 Data : DWord;
1006 ErrorD : DWord;
1007 ParmErr : DWord;
1008 const
1009 MaxDate = $0002D210; { 2/5/2106 }
1010 begin
1011 {
1012 1. Setting Date/Time to 0 will make a Non-Expiring account.
1013 2. Dates must be >= 1/1/1980 12:00:00 AM
1014 3. Dates must be <= 2/5/2106 23:59:59 AM
1015 }
1016 if (Value.D <> AccountExpires.D) or (Value.T <> AccountExpires.T) then begin
1017 if (Value.D = 0) and (Value.T = 0) then
1018 Data := TIMEQ_FOREVER
1019 else begin
1020 if ((Value.D >= Date1980) and (Value.T >= 0)) and
1021 ((Value.D <= MaxDate) and (Value.T < SecondsInDay)) then begin
1022 Data := StDateTimeToUnixTime(LocalDateTimeToGlobal(Value, 0));
1023 end else begin
1024 RaiseStError(EStNetException, stscNetDateSpecifiedOutOfRange);
1025 Exit;
1026 end;
1027 end;
1028
1029 ErrorD := StNetUserSetInfo(FServer, FName, 1017, @Data, ParmErr);
1030 if ErrorD = NERR_SUCCESS then begin
1031 if (Value.D = 0) and (Value.T = 0) then
1032 Data := TIMEQ_FOREVER;
1033 TUSER_INFO_3(FUserData^).usri3_acct_expires := Data;
1034 end else begin
1035 RaiseStWin32Error(EStNetException, ErrorD);
1036 end;
1037 end;
1038 end;
1039
1040 procedure TStNetUserItem.SetComment(Value: string);
1041 var
1042 ErrorD : DWord;
1043 ParmErr : DWord;
1044 Data : TLMWideChar;
1045 begin
1046 if Value <> Comment then begin
1047 Data.Value := nil;
1048 try
1049 CvtToWideCharLM(Value, Data);
1050 ErrorD := StNetUserSetInfo(FServer, FName, 1007, @Data.Value, ParmErr);
1051 if ErrorD = NERR_SUCCESS then begin
1052 StNetApiBufferFree(TUSER_INFO_3(FUserData^).usri3_comment);
1053 TUSER_INFO_3(FUserData^).usri3_comment := Data.Value;
1054 FComment := Value;
1055 end else begin
1056 RaiseStWin32Error(EStNetException, ErrorD);
1057 end;
1058 except
1059 StNetApiBufferFree(Data.Value);
1060 raise;
1061 end;
1062 end;
1063 end;
1064
1065 procedure TStNetUserItem.SetFullName(Value: string);
1066 var
1067 ErrorD : DWord;
1068 ParmErr : DWord;
1069 Data : TLMWideChar;
1070 begin
1071 if Value <> FullName then begin
1072 Data.Value := nil;
1073 try
1074 CvtToWideCharLM(Value, Data);
1075 ErrorD := StNetUserSetInfo(FServer, FName, 1011, @Data.Value, ParmErr);
1076 if ErrorD = NERR_SUCCESS then begin
1077 StNetApiBufferFree(TUSER_INFO_3(FUserData^).usri3_full_name);
1078 TUSER_INFO_3(FUserData^).usri3_full_name := Data.Value;
1079 end else begin
1080 RaiseStWin32Error(EStNetException, ErrorD);
1081 end;
1082 except
1083 StNetApiBufferFree(Data.Value);
1084 raise;
1085 end;
1086 end;
1087 end;
1088
1089 procedure TStNetUserItem.SetHomeDirectory(Value: string);
1090 var
1091 ErrorD : DWord;
1092 ParmErr : DWord;
1093 Data : TLMWideChar;
1094 begin
1095 if Value <> HomeDirectory then begin
1096 Data.Value := nil;
1097 try
1098 CvtToWideCharLM(Value, Data);
1099 ErrorD := StNetUserSetInfo(FServer, FName, 1006, @Data.Value, ParmErr);
1100 if ErrorD = NERR_SUCCESS then begin
1101 StNetApiBufferFree(TUSER_INFO_3(FUserData^).usri3_home_dir);
1102 TUSER_INFO_3(FUserData^).usri3_home_dir := Data.Value;
1103 end else begin
1104 RaiseStWin32Error(EStNetException, ErrorD);
1105 end;
1106 except
1107 StNetApiBufferFree(Data.Value);
1108 raise;
1109 end;
1110 end;
1111 end;
1112
1113 procedure TStNetUserItem.SetHomeDrive(Value: string);
1114 var
1115 ErrorD : DWord;
1116 ParmErr : DWord;
1117 Data : TLMWideChar;
1118 begin
1119 if Value <> HomeDirectory then begin
1120 Data.Value := nil;
1121 try
1122 CvtToWideCharLM(Value, Data);
1123 ErrorD := StNetUserSetInfo(FServer, FName, 1053, @Data.Value, ParmErr);
1124 if ErrorD = NERR_SUCCESS then begin
1125 StNetApiBufferFree(TUSER_INFO_3(FUserData^).usri3_home_dir_drive);
1126 TUSER_INFO_3(FUserData^).usri3_home_dir_drive := Data.Value;
1127 end else begin
1128 RaiseStWin32Error(EStNetException, ErrorD);
1129 end;
1130 except
1131 StNetApiBufferFree(Data.Value);
1132 raise;
1133 end;
1134 end;
1135 end;
1136
1137 procedure TStNetUserItem.SetLockedOut(Value: Boolean);
1138 var
1139 Data : DWord;
1140 ErrorD : DWord;
1141 ParmErr : DWord;
1142 begin
1143 if LockedOut then begin
1144 if Value = False then begin
1145 Data := TUSER_INFO_3(FUserData^).usri3_flags;
1146 ClearLongFlag(LongInt(Data), UF_LOCKOUT);
1147
1148 ErrorD := StNetUserSetInfo(FServer, FName, 1008, @Data, ParmErr);
1149 if ErrorD = NERR_SUCCESS then
1150 TUSER_INFO_3(FUserData^).usri3_flags := Data
1151 else
1152 RaiseStWin32Error(EStNetException, ErrorD);
1153 end else begin
1154 {can only CLEAR a lockout }
1155 RaiseStError(EStNetException, stscNetInvalidParameter);
1156 end;
1157 end;
1158 end;
1159
1160 procedure TStNetUserItem.SetName(Value: string);
1161 var
1162 ErrorD : DWord;
1163 ParmErr : DWord;
1164 Data : TLMWideChar;
1165 S : TStNetServerItem;
1166 begin
1167 if Value <> Name then begin
1168 Data.Value := nil;
1169 try
1170 CvtToWideCharLM(Value, Data);
1171 ErrorD := StNetUserSetInfo(FServer, FName, 0, @Data.Value, ParmErr);
1172 if ErrorD = NERR_SUCCESS then begin
1173 StNetApiBufferFree(TUSER_INFO_3(FUserData^).usri3_name);
1174 TUSER_INFO_3(FUserData^).usri3_name := Data.Value;
1175
1176 S := FNetwork.Server[FServer];
1177 S.FUserList[S.FUserList.IndexOf(FName)] := Value;;
1178
1179 FName := Value;
1180 end else begin
1181 RaiseStWin32Error(EStNetException, ErrorD);
1182 end;
1183 except
1184 StNetApiBufferFree(Data.Value);
1185 raise;
1186 end;
1187 end;
1188 end;
1189
1190 procedure TStNetUserItem.SetNoUserPasswordChange(Value: Boolean);
1191 var
1192 Data : DWord;
1193 ErrorD : DWord;
1194 ParmErr : DWord;
1195 begin
1196 if Value <> NoUserPasswordChange then begin
1197 Data := TUSER_INFO_3(FUserData^).usri3_flags;
1198 if Value then
1199 SetLongFlag(LongInt(Data), UF_PASSWD_CANT_CHANGE)
1200 else
1201 ClearLongFlag(LongInt(Data), UF_PASSWD_CANT_CHANGE);
1202
1203 ErrorD := StNetUserSetInfo(FServer, FName, 1008, @Data, ParmErr);
1204 if ErrorD = NERR_SUCCESS then
1205 TUSER_INFO_3(FUserData^).usri3_flags := Data
1206 else
1207 RaiseStWin32Error(EStNetException, ErrorD);
1208 end;
1209 end;
1210
1211 procedure TStNetUserItem.SetPasswordAdmin(Value: string);
1212 var
1213 ErrorD : DWord;
1214 ParmErr : DWord;
1215 Data : TLMWideChar;
1216 begin
1217 Data.Value := nil;
1218 try
1219 { allocate the unicode password }
1220 CvtToWideCharLM(Value, Data);
1221
1222 ErrorD := StNetUserSetInfo(FServer, FName, 1003, @Data.Value, ParmErr);
1223 if ErrorD = NERR_SUCCESS then begin
1224 { no need to update internal data .. password is write-only}
1225 end else begin
1226 RaiseStWin32Error(EStNetException, ErrorD);
1227 end;
1228 finally
1229 StNetApiBufferFree(Data.Value);
1230 end;
1231 end;
1232
1233 procedure TStNetUserItem.SetPassword(OldPassword, NewPassword: string);
1234 var
1235 ErrorD : DWord;
1236 TempServer : string;
1237 S : TStNetServerItem;
1238 begin
1239 { if the server is a BDC, we need to change it on the PDC }
1240 S := StNetwork.Server[FServer];
1241 if (nsvtDomainBackupCtrl in S.ServerType) then begin
1242 TempServer := S.PrimaryDC;
1243 end else begin
1244 TempServer := FServer;
1245 end;
1246
1247 ErrorD := StNetUserChangePassword(TempServer, FName, OldPassword, NewPassword);
1248 if ErrorD = NERR_SUCCESS then begin
1249 { Nothing else to do }
1250 end else begin
1251 RaiseStWin32Error(EStNetException, ErrorD);
1252 end;
1253 end;
1254
1255 procedure TStNetUserItem.SetPasswordNeverExpires(Value: Boolean);
1256 var
1257 Data : DWord;
1258 ErrorD : DWord;
1259 ParmErr : DWord;
1260 begin
1261 if Value <> PasswordNeverExpires then begin
1262 Data := TUSER_INFO_3(FUserData^).usri3_flags;
1263 if Value then
1264 SetLongFlag(LongInt(Data), UF_DONT_EXPIRE_PASSWD)
1265 else
1266 ClearLongFlag(LongInt(Data), UF_DONT_EXPIRE_PASSWD);
1267
1268 ErrorD := StNetUserSetInfo(FServer, FName, 1008, @Data, ParmErr);
1269 if ErrorD = NERR_SUCCESS then
1270 TUSER_INFO_3(FUserData^).usri3_flags := Data
1271 else
1272 RaiseStWin32Error(EStNetException, ErrorD);
1273 end;
1274 end;
1275
1276 procedure TStNetUserItem.SetPasswordExpired(Value: Boolean);
1277 var
1278 Data : DWord;
1279 ErrorD : DWord;
1280 ParmErr : DWord;
1281 begin
1282 if Value <> PasswordExpired then begin
1283 Data := TUSER_INFO_3(FUserData^).usri3_password_expired;
1284 if Value then
1285 TUSER_INFO_3(FUserData^).usri3_password_expired := DWord(-1)
1286 else
1287 TUSER_INFO_3(FUserData^).usri3_password_expired := 0;
1288
1289 ErrorD := StNetUserSetInfo(FServer, FName, 3, FUserData, ParmErr);
1290 if ErrorD = NERR_SUCCESS then
1291 { The data was already updated }
1292 else begin
1293 TUSER_INFO_3(FUserData^).usri3_password_expired := Data;
1294 RaiseStWin32Error(EStNetException, ErrorD);
1295 end;
1296 end;
1297 end;
1298
1299 procedure TStNetUserItem.SetPasswordNotRequired(Value: Boolean);
1300 var
1301 Data : DWord;
1302 ErrorD : DWord;
1303 ParmErr : DWord;
1304 begin
1305 if Value <> PasswordNotRequired then begin
1306 Data := TUSER_INFO_3(FUserData^).usri3_flags;
1307 if Value then
1308 SetLongFlag(LongInt(Data), UF_PASSWD_NOTREQD)
1309 else
1310 ClearLongFlag(LongInt(Data), UF_PASSWD_NOTREQD);
1311
1312 ErrorD := StNetUserSetInfo(FServer, FName, 1008, @Data, ParmErr);
1313 if ErrorD = NERR_SUCCESS then
1314 TUSER_INFO_3(FUserData^).usri3_flags := Data
1315 else
1316 RaiseStWin32Error(EStNetException, ErrorD);
1317 end;
1318 end;
1319
1320 procedure TStNetUserItem.SetPrimaryGroup(Value: TStNetItem);
1321 var
1322 ErrorD : DWord;
1323 ParmErr : DWord;
1324 Data : DWord;
1325 begin
1326 if TStNetGroupItem(Value).ID <> TStNetGroupItem(PrimaryGroup).ID then begin
1327 Data := TStNetGroupItem(Value).ID;
1328 ErrorD := StNetUserSetInfo(FServer, FName, 1051, @Data, ParmErr);
1329 if ErrorD = NERR_SUCCESS then begin
1330 TUSER_INFO_3(FUserData^).usri3_primary_group_id := Data
1331 end else begin
1332 RaiseStWin32Error(EStNetException, ErrorD);
1333 end;
1334 end;
1335 end;
1336
1337 procedure TStNetUserItem.SetProfilePath(Value: string);
1338 var
1339 ErrorD : DWord;
1340 ParmErr : DWord;
1341 Data : TLMWideChar;
1342 begin
1343 if Value <> ProfilePath then begin
1344 Data.Value := nil;
1345 try
1346 CvtToWideCharLM(Value, Data);
1347 ErrorD := StNetUserSetInfo(FServer, FName, 1052, @Data.Value, ParmErr);
1348 if ErrorD = NERR_SUCCESS then begin
1349 StNetApiBufferFree(TUSER_INFO_3(FUserData^).usri3_profile);
1350 TUSER_INFO_3(FUserData^).usri3_profile := Data.Value;
1351 end else begin
1352 RaiseStWin32Error(EStNetException, ErrorD);
1353 end;
1354 except
1355 StNetApiBufferFree(Data.Value);
1356 raise;
1357 end;
1358 end;
1359 end;
1360
1361 procedure TStNetUserItem.SetScriptPath(Value: string);
1362 var
1363 ErrorD : DWord;
1364 ParmErr : DWord;
1365 Data : TLMWideChar;
1366 begin
1367 if Value <> ScriptPath then begin
1368 Data.Value := nil;
1369 try
1370 CvtToWideCharLM(Value, Data);
1371 ErrorD := StNetUserSetInfo(FServer, FName, 1009, @Data.Value, ParmErr);
1372 if ErrorD = NERR_SUCCESS then begin
1373 StNetApiBufferFree(TUSER_INFO_3(FUserData^).usri3_script_path);
1374 TUSER_INFO_3(FUserData^).usri3_script_path := Data.Value;
1375 end else begin
1376 RaiseStWin32Error(EStNetException, ErrorD);
1377 end;
1378 except
1379 StNetApiBufferFree(Data.Value);
1380 raise;
1381 end;
1382 end;
1383 end;
1384
1385 procedure TStNetUserItem.SetUserComment(Value: string);
1386 var
1387 ErrorD : DWord;
1388 ParmErr : DWord;
1389 Data : TLMWideChar;
1390 begin
1391 if Value <> UserComment then begin
1392 Data.Value := nil;
1393 try
1394 CvtToWideCharLM(Value, Data);
1395 ErrorD := StNetUserSetInfo(FServer, FName, 1012, @Data.Value, ParmErr);
1396 if ErrorD = NERR_SUCCESS then begin
1397 StNetApiBufferFree(TUSER_INFO_3(FUserData^).usri3_usr_comment);
1398 TUSER_INFO_3(FUserData^).usri3_usr_comment := Data.Value;
1399 end else begin
1400 RaiseStWin32Error(EStNetException, ErrorD);
1401 end;
1402 except
1403 StNetApiBufferFree(Data.Value);
1404 raise;
1405 end;
1406 end;
1407 end;
1408
1409 procedure TStNetUserItem.SetWorkstations(Value: TStrings);
1410 var
1411 ErrorD : DWord;
1412 ParmErr : DWord;
1413 Data : TLMWideChar;
1414 begin
1415 if Value.CommaText <> WorkStations.CommaText then begin
1416 Data.Value := nil;
1417 try
1418 CvtToWideCharLM(Value.CommaText, Data);
1419 ErrorD := StNetUserSetInfo(FServer, FName, 1014, @Data.Value, ParmErr);
1420 if ErrorD = NERR_SUCCESS then begin
1421 StNetApiBufferFree(TUSER_INFO_3(FUserData^).usri3_workstations);
1422 TUSER_INFO_3(FUserData^).usri3_workstations := Data.Value;
1423 end else begin
1424 RaiseStWin32Error(EStNetException, ErrorD);
1425 end;
1426 except
1427 StNetApiBufferFree(Data.Value);
1428 raise;
1429 end;
1430 end;
1431 end;
1432
1433 procedure TStNetUserItem.GetLogonHours(var LogonHours: TStNetUserLogonTimes);
1434 {$IFNDEF VERSION4}
1435 const
1436 TIME_ZONE_ID_INVALID = DWORD($FFFFFFFF);
1437 TIME_ZONE_ID_UNKNOWN = 0;
1438 TIME_ZONE_ID_STANDARD = 1;
1439 TIME_ZONE_ID_DAYLIGHT = 2;
1440 {$ENDIF}
1441 type
1442 LHFlags = array[0..167] of Boolean;
1443 TLHData = array[TStDayType] of array[0..2] of Byte;
1444 var
1445 Data : TLHData;
1446 GMTOffset : Integer;
1447 BitOffset : Integer;
1448 DayOfWeek : Integer;
1449 HourOfDay : Integer;
1450 TZ : TTimeZoneInformation;
1451 const
1452 BitFlags : array[0..7] of byte = ($01, $02, $04, $08, $10, $20, $40, $80);
1453 begin
1454 if (FUserData = nil) then
1455 Refresh;
1456
1457 case GetTimeZoneInformation(TZ) of
1458 TIME_ZONE_ID_UNKNOWN :
1459 GMTOffset := TZ.Bias div MinutesInHour;
1460 TIME_ZONE_ID_STANDARD:
1461 GMTOffset := (TZ.Bias + TZ.StandardBias) div MinutesInHour;
1462 TIME_ZONE_ID_DAYLIGHT:
1463 GMTOffset := (TZ.Bias + TZ.DaylightBias) div MinutesInHour;
1464 else
1465 GMTOffset := 0;
1466 end;
1467 Data := TLHData(TUSER_INFO_3(FUserData^).usri3_logon_hours^);
1468
1469 { Populate the logon hours array with correct information adjusted for GMT}
1470 for DayOfWeek := Ord(Sunday) to Ord(Saturday) do begin
1471 for HourOfDay := 0 to HoursInDay-1 do begin
1472
1473 { Get the correct offset into the array of booleans }
1474 BitOffset := -(GMTOffset) + ((DayOfWeek * HoursInDay) + HourOfDay);
1475 if BitOffset > 168 then
1476 Dec(BitOffset, 168)
1477 else if BitOffset < 1 then
1478 Inc(BitOffset, 168);
1479
1480 { set the correct True or False flag in the array }
1481 LHFlags(LogonHours)[BitOffset-1] :=
1482 ByteFlagIsSet(Data[TStDayType(DayOfWeek)][HourOfDay div 8],
1483 BitFlags[HourOfDay mod 8]);
1484 end;
1485 end;
1486 end;
1487
1488 procedure TStNetUserItem.SetLogonHours(LogonHours: TStNetUserLogonTimes);
1489 {$IFNDEF VERSION4}
1490 const
1491 TIME_ZONE_ID_INVALID = DWORD($FFFFFFFF);
1492 TIME_ZONE_ID_UNKNOWN = 0;
1493 TIME_ZONE_ID_STANDARD = 1;
1494 TIME_ZONE_ID_DAYLIGHT = 2;
1495 {$ENDIF}
1496 type
1497 LHFlags = array[0..167] of Boolean;
1498 TLHData = array[TStDayType] of array[0..2] of Byte;
1499 var
1500 Data : TLHData;
1501 GMTOffset : Integer;
1502 BitOffset : Integer;
1503 DayOfWeek : Integer;
1504 HourOfDay : Integer;
1505 TZ : TTimeZoneInformation;
1506 USER_INFO : TUSER_INFO_1020;
1507 ErrorD : DWord;
1508 ParmErr : DWord;
1509 const
1510 BitFlags : array[0..7] of byte = ($01, $02, $04, $08, $10, $20, $40, $80);
1511 begin
1512 if (FUserData = nil) then
1513 Refresh;
1514
1515 case GetTimeZoneInformation(TZ) of
1516 TIME_ZONE_ID_UNKNOWN :
1517 GMTOffset := TZ.Bias div MinutesInHour;
1518 TIME_ZONE_ID_STANDARD:
1519 GMTOffset := (TZ.Bias + TZ.StandardBias) div MinutesInHour;
1520 TIME_ZONE_ID_DAYLIGHT:
1521 GMTOffset := (TZ.Bias + TZ.DaylightBias) div MinutesInHour;
1522 else
1523 GMTOffset := 0;
1524 end;
1525
1526 { Default to ALL hours for logon }
1527 FillChar(Data, SizeOf(Data), 255);
1528
1529 { Populate the logon hours structure with correct information }
1530 for DayOfWeek := Ord(Sunday) to Ord(Saturday) do begin
1531 for HourOfDay := 0 to HoursInDay-1 do begin
1532
1533 { Get the correct offset into the array of booleans }
1534 BitOffset := -(GMTOffset) + ((DayOfWeek * HoursInDay) + HourOfDay);
1535 if BitOffset > 168 then
1536 Dec(BitOffset, 168)
1537 else if BitOffset < 1 then
1538 Inc(BitOffset, 168);
1539
1540 { just set the True logon hours (already set to False) }
1541 if not LHFlags(LogonHours)[BitOffset-1] then
1542 ClearByteFlag(Data[TStDayType(DayOfWeek)][HourOfDay div 8],
1543 BitFlags[HourOfDay mod 8]);
1544 end;
1545 end;
1546
1547 { Update the server with the new logon hours }
1548 USER_INFO.usri1020_logon_hours := @Data;
1549 USER_INFO.usri1020_units_per_week := UNITS_PER_WEEK;
1550 ErrorD := StNetUserSetInfo(FServer, FName, 1020, @USER_INFO, ParmErr);
1551 if ErrorD = NERR_SUCCESS then begin
1552 TUSER_INFO_3(FUserData^).usri3_logon_hours := @Data;
1553 end else begin
1554 RaiseStWin32Error(EStNetException, ErrorD);
1555 end;
1556 end;
1557
1558
1559 { --- TStNetGroupItem ------------------------------------------------------- }
1560
1561 constructor TStNetGroupItem.CreateEx(AName, AComment, AServer: string;
1562 AItemType: TStNetItemType);
1563 var
1564 Buffer : Pointer;
1565 ErrorD : DWord;
1566 begin
1567 inherited CreateEx(AName, AComment, AServer, AItemType);
1568
1569 FItemList := TStringList.Create;
1570 FillChar(FSidRecord, SizeOf(TStSidRecord), 0);
1571
1572 { need to find out what type of group this is }
1573 if (AItemType = nitUnknown) or ((AItemType = nitGlobalGroup) and (FID = 0)) then begin
1574 ErrorD := StNetGroupGetInfo(FServer, FName, 2, Buffer);
1575 if ErrorD = NERR_SUCCESS then begin
1576 try
1577 FItemType := nitGlobalGroup;
1578 FID := TGROUP_INFO_2(Buffer^).grpi2_group_id;
1579 FComment := TGROUP_INFO_2(Buffer^).grpi2_comment;
1580 finally
1581 StNetApiBufferFree(Buffer);
1582 Buffer := nil;
1583 end;
1584 end else begin
1585 { its not a global group ... try a local one }
1586 ErrorD := StNetLocalGroupGetInfo(FServer, FName, 1, Buffer);
1587 if ErrorD = NERR_SUCCESS then begin
1588 try
1589 FItemType := nitLocalGroup;
1590 FComment := TLOCALGROUP_INFO_1(Buffer^).lgrpi1_comment;
1591 finally
1592 StNetApiBufferFree(Buffer);
1593 Buffer := nil;
1594 end;
1595 end else begin
1596 RaiseStWin32Error(EStNetException, ErrorD);
1597 end;
1598 end;
1599 end;
1600 end;
1601
1602 constructor TStNetGroupItem.CreateExEnum(AName, AComment, AServer: string;
1603 AID: Cardinal);
1604 begin
1605 inherited CreateEx(AName, AComment, AServer, nitUnknown);
1606 FItemList := TStringList.Create;
1607
1608 FID := AID;
1609
1610 if AID > 0 then
1611 FItemType := nitGlobalGroup
1612 else
1613 FItemType := nitLocalGroup;
1614 end;
1615
1616 destructor TStNetGroupItem.Destroy;
1617 begin
1618 FItemList.Free;
1619
1620 if (FSidRecord.Value <> nil) then
1621 StNetApiBufferFree(FSidRecord.Value);
1622
1623 inherited Destroy;
1624 end;
1625
1626 function TStNetGroupItem.GetGroupItemList: TStringList;
1627
1628 function JustDomain(Value: string): string;
1629 begin
1630 Result := StrStCopyL(Value, 1, Pos('\', Value)-1);
1631 end;
1632
1633 function JustName(Value: string): string;
1634 begin
1635 Result := StrStCopyL(Value, Pos('\', Value)+1, Length(Value));
1636 end;
1637
1638 var
1639 NewList : TStringList;
1640 ErrorD : DWord;
1641 Index : Integer;
1642 Buffer : Pointer;
1643 DBuffer : string;
1644 EntriesRead : DWord;
1645 TotalEntries : DWord;
1646 S : TStNetServerItem;
1647 NewItem : TStNetItem;
1648 CurrentName : string;
1649 CurrentDandN : string;
1650 CurrentDomain: string;
1651 begin
1652 NewList := TStringList.Create;
1653 try
1654 { get the list of items that this group has }
1655 case ItemType of
1656 nitGlobalGroup :
1657 begin
1658 ErrorD := StNetGroupGetUsers(FServer, FName, 0, Buffer, DWord(-1),
1659 EntriesRead, TotalEntries, nil);
1660 if ErrorD = NERR_SUCCESS then begin
1661 try
1662 if EntriesRead > 0 then begin {!!.02}
1663 for Index := 0 to EntriesRead-1 do begin
1664 CurrentName := TGroupUsersInfo0Array(Buffer^)[Index].grui0_name;
1665
1666 { does this group already exist in the servers list of groups }
1667 NewItem := nil;
1668 if (FNetwork <> nil) then begin
1669 S := FNetwork.Server[FServer];
1670 NewItem := S.User[CurrentName];
1671 end;
1672
1673 if (NewItem = nil) then begin
1674 NewItem := TStNetUserItem.CreateEx(CurrentName, '', FServer,
1675 nitUnknown);
1676 NewItem.FNetwork := FNetwork;
1677 end;
1678 NewList.AddObject(CurrentName, NewItem);
1679 end;
1680 end; {!!.02}
1681 finally
1682 StNetApiBufferFree(Buffer);
1683 Buffer := nil;
1684 end;
1685 end else begin
1686 RaiseStWin32Error(EStNetException, ErrorD);
1687 end;
1688 end;
1689 nitLocalGroup :
1690 begin
1691 ErrorD := StNetLocalGroupGetMembers(FServer, FName, 2, Buffer,
1692 DWord(-1), EntriesRead,
1693 TotalEntries, nil);
1694 if ErrorD = NERR_SUCCESS then begin
1695 try
1696 if EntriesRead > 0 then begin {!!.02}
1697 for Index := 0 to EntriesRead-1 do begin
1698 CurrentDandN := TLocalGroupMembersInfo2Array(Buffer^)[Index].lgrmi2_domainandname;
1699 CurrentDomain := JustDomain(CurrentDandN);
1700 CurrentName := JustName(CurrentDandN);
1701
1702 if (UpperCase(CurrentDomain) <> UpperCase(FServer)) and
1703 (UpperCase(CurrentDomain) <> 'NT AUTHORITY') then begin
1704
1705 ErrorD := StNetGetDCName('', CurrentDomain, DBuffer);
1706 if ErrorD = NERR_SUCCESS then
1707 CurrentDomain := FilterL(DBuffer, '\')
1708 else
1709 RaiseStWin32Error(EStNetException, ErrorD);
1710 end else begin
1711 CurrentDomain := FServer;
1712 end;
1713
1714 NewItem := nil;
1715 case TLocalGroupMembersInfo2Array(Buffer^)[Index].lgrmi2_sidusage of
1716 SidTypeUser :
1717 begin
1718 if (FNetwork <> nil) then begin
1719 S := FNetwork.Server[CurrentDomain];
1720 NewItem := S.User[CurrentName];
1721 end;
1722
1723 if (NewItem = nil) then begin
1724 NewItem := TStNetUserItem.CreateEx(CurrentName, '',
1725 CurrentDomain,
1726 nitUnknown);
1727 NewItem.FNetwork := FNetwork;
1728 end;
1729 NewList.AddObject(CurrentName, NewItem);
1730 end;
1731 SidTypeGroup :
1732 begin
1733 if (FNetwork <> nil) then begin
1734 S := FNetwork.Server[CurrentDomain];
1735 NewItem := S.Group[CurrentName]
1736 end;
1737
1738 if (NewItem = nil) then begin
1739 NewItem := TStNetGroupItem.CreateEx(CurrentName, '',
1740 CurrentDomain,
1741 nitUnknown);
1742 NewItem.FNetwork := FNetwork;
1743 end;
1744 NewList.AddObject(CurrentName, NewItem);
1745 end;
1746 SidTypeWellKnownGroup :
1747 begin
1748 { filter out these groups }
1749 end;
1750 end;
1751 end;
1752 end; {!!.02}
1753 finally
1754 StNetApiBufferFree(Buffer);
1755 Buffer := nil;
1756 end;
1757 end else begin
1758 RaiseStWin32Error(EStNetException, ErrorD);
1759 end;
1760 end;
1761 end;
1762 FItemList.Assign(NewList);
1763 finally
1764 NewList.Free;
1765 end;
1766 Result := FItemList as TStringList;
1767 end;
1768
1769 function TStNetGroupItem.GetDomain: string;
1770 begin
1771 if (FSidRecord.Value = nil) then begin
1772 FSidRecord := GetSid;
1773 end;
1774 Result := FDomain;
1775 end;
1776
1777 function TStNetGroupItem.GetSid: TStSidRecord;
1778 var
1779 NoError: Boolean;
1780 _SidUse: DWord;
1781 Index : Integer;
1782 begin
1783 if (FSidRecord.Value = nil) then begin
1784 NoError := StLookupAccountName(FServer, FName, FSidRecord.Value,
1785 FSidRecord.Length, FDomain, _SidUse);
1786 if NoError then begin
1787 { and the SID usage flag to the enumeration }
1788 FSidRecord.Usage := TStNetSidType(_SidUse);
1789
1790 { convert the sid to a readable string }
1791 FSidRecord.ValueS :=
1792 Format('S-1-%d',
1793 [TSIDIdentifierAuthority(
1794 StGetSidIdentifierAuthority(FSidRecord.Value)^).Value[5]]);
1795
1796 for Index := 0 to StGetSidSubAuthorityCount(FSidRecord.Value) - 1 do begin
1797 FSidRecord.ValueS :=
1798 Format(FSidRecord.ValueS + '-%d', [StGetSidSubAuthority(
1799 FSidRecord.Value, Index)]);
1800 end;
1801 end else begin
1802 RaiseStWin32Error(EStNetException, GetLastError);
1803 end;
1804 end;
1805 Result := FSidRecord;
1806 end;
1807
1808 procedure TStNetGroupItem.AddToGroup(AItem: TStNetItem);
1809 var
1810 ErrorD : DWord;
1811 S : PSid;
1812 begin
1813 case ItemType of
1814 nitGlobalGroup :
1815 begin
1816 if (AItem.ItemType = nitLocalUser) or (AItem.ItemType = nitGlobalUser) then begin
1817 ErrorD := StNetGroupAddUser(FServer, FName, AItem.Name);
1818 if ErrorD = NERR_SUCCESS then begin
1819 { add this user to this groups internal list }
1820 FItemList.AddObject(AItem.Name, AItem);
1821 end else begin
1822 RaiseStWin32Error(EStNetException, ErrorD);
1823 end;
1824 end else begin
1825 { can't add this item type to the group }
1826 RaiseStWin32Error(EStNetException, stscNetInvalidItemType);
1827 end;
1828 end;
1829 nitLocalGroup :
1830 begin
1831 if (AItem.ItemType = nitLocalUser) or (AItem.ItemType = nitGlobalUser) or
1832 (AItem.ItemType = nitGlobalGroup) then begin
1833
1834 { get the SID for this user }
1835 S := nil;
1836 case AItem.ItemType of
1837 nitLocalUser, nitGlobalUser : S := TStNetUserItem(AItem).Sid.Value;
1838 nitGlobalGroup : S := TStNetGroupItem(AItem).Sid.Value;
1839 end;
1840
1841 ErrorD := StNetLocalGroupAddMembers(FServer, FName, 0, S, 1);
1842 if ErrorD = NERR_SUCCESS then begin
1843 { add this user to this groups internal list }
1844 FItemList.AddObject(AItem.Name, AItem);
1845 end else begin
1846 RaiseStWin32Error(EStNetException, ErrorD);
1847 end;
1848 end else begin
1849 { can't add this item type to the group }
1850 RaiseStWin32Error(EStNetException, stscNetInvalidItemType);
1851 end;
1852 end;
1853 end;
1854 end;
1855
1856 procedure TStNetGroupItem.RemoveFromGroup(AItem: TStNetItem);
1857 var
1858 ErrorD : DWord;
1859 S : PSid;
1860 begin
1861 case ItemType of
1862 nitGlobalGroup :
1863 begin
1864 if (AItem.ItemType = nitLocalUser) or (AItem.ItemType = nitGlobalUser) then begin
1865 ErrorD := StNetGroupDelUser(FServer, FName, AItem.Name);
1866 if ErrorD = NERR_SUCCESS then begin
1867 { remove this user from the groups internal list }
1868 FItemList.Delete(FItemList.IndexOf(AItem.Name));
1869 end else begin
1870 RaiseStWin32Error(EStNetException, ErrorD);
1871 end;
1872 end else begin
1873 { this item can't be in a group .. unable to remove it }
1874 RaiseStWin32Error(EStNetException, stscNetInvalidItemType);
1875 end;
1876 end;
1877 nitLocalGroup :
1878 begin
1879 if (AItem.ItemType = nitLocalUser) or (AItem.ItemType = nitGlobalUser) or
1880 (AItem.ItemType = nitGlobalGroup) then begin
1881
1882 { get the SID for this user }
1883 S := nil;
1884 case AItem.ItemType of
1885 nitLocalUser, nitGlobalUser : S := TStNetUserItem(AItem).Sid.Value;
1886 nitGlobalGroup : S := TStNetGroupItem(AItem).Sid.Value;
1887 end;
1888
1889 ErrorD := StNetLocalGroupDelMembers(FServer, FName, 0, S, 1);
1890 if ErrorD = NERR_SUCCESS then begin
1891 { remove this user from the groups internal list }
1892 FItemList.Delete(FItemList.IndexOf(AItem.Name));
1893 end else begin
1894 RaiseStWin32Error(EStNetException, ErrorD);
1895 end;
1896 end else begin
1897 { this item can't be in a group .. unable to remove it }
1898 RaiseStWin32Error(EStNetException, stscNetInvalidItemType);
1899 end;
1900 end;
1901 end;
1902 end;
1903
1904 procedure TStNetGroupItem.Delete;
1905 var
1906 ErrorD : DWord;
1907 begin
1908 case ItemType of
1909 nitGlobalGroup :
1910 begin
1911 ErrorD := StNetGroupDel(FServer, FName);
1912 if ErrorD = NERR_SUCCESS then begin
1913 { can't possible remove it from all lists, but at least remove from server list }
1914 FNetwork.Server[FServer].FGroupList.Delete(FNetwork.Server[FServer].FGroupList.IndexOf(FName));
1915
1916 { free this item }
1917 Free;
1918 end else begin
1919 RaiseStWin32Error(EStNetException, ErrorD);
1920 end;
1921 end;
1922 nitLocalGroup :
1923 begin
1924 ErrorD := StNetLocalGroupDel(FServer, FName);
1925 if ErrorD = NERR_SUCCESS then begin
1926 { can't possible remove it from all lists, but at least remove from server list }
1927 FNetwork.Server[FServer].FGroupList.Delete(FNetwork.Server[FServer].FGroupList.IndexOf(FName));
1928
1929 { free this item }
1930 Free;
1931 end else begin
1932 RaiseStWin32Error(EStNetException, ErrorD);
1933 end;
1934 end;
1935 end;
1936 end;
1937
1938 procedure TStNetGroupItem.Refresh;
1939 var
1940 ErrorD : DWord;
1941 Buffer : Pointer;
1942 begin
1943 case ItemType of
1944 nitGlobalGroup :
1945 begin
1946 ErrorD := StNetGroupGetInfo(FServer, FName, 2, Buffer);
1947 if ErrorD = NERR_SUCCESS then begin
1948 try
1949 FID := TGROUP_INFO_2(Buffer^).grpi2_group_id;
1950 FComment := TGROUP_INFO_2(Buffer^).grpi2_comment;
1951 finally
1952 StNetApiBufferFree(Buffer);
1953 Buffer := nil;
1954 end;
1955 end else begin
1956 RaiseStWin32Error(EStNetException, ErrorD);
1957 end;;
1958 end;
1959 nitLocalGroup :
1960 begin
1961 ErrorD := StNetLocalGroupGetInfo(FServer, FName, 1, Buffer);
1962 if ErrorD = NERR_SUCCESS then begin
1963 try
1964 FID := TGROUP_INFO_2(Buffer^).grpi2_group_id;
1965 FComment := TGROUP_INFO_2(Buffer^).grpi2_comment;
1966 finally
1967 StNetApiBufferFree(Buffer);
1968 Buffer := nil;
1969 end;
1970 end else begin
1971 RaiseStWin32Error(EStNetException, ErrorD);
1972 end;;
1973 end;
1974 end;
1975 end;
1976
1977 function TStNetGroupItem.GetName: string;
1978 begin
1979 Result := FName;
1980 end;
1981
1982 procedure TStNetGroupItem.SetName(Value: string);
1983 var
1984 ErrorD : DWord;
1985 Data : TLMWideChar;
1986 ParmErr : DWord;
1987 S : TStNetServerItem;
1988 begin
1989 if Value <> FName then begin
1990 case ItemType of
1991 nitGlobalGroup :
1992 begin
1993 Data.Value := nil;
1994 try
1995 CvtToWideCharLM(Value, Data);
1996 ErrorD := StNetGroupSetInfo(FServer, FName, 0, @Data.Value, ParmErr);
1997 if ErrorD = NERR_SUCCESS then begin
1998 S := FNetwork.Server[FServer];
1999 S.FGroupList[S.FGroupList.IndexOf(FName)] := Value;;
2000
2001 FName := Value;
2002 end else begin
2003 RaiseStWin32Error(EStNetException, ErrorD);
2004 end;
2005 finally
2006 StNetApiBufferFree(Data.Value);
2007 end;
2008 end;
2009 nitLocalGroup :
2010 begin
2011 Data.Value := nil;
2012 try
2013 CvtToWideCharLM(Value, Data);
2014 ErrorD := StNetLocalGroupSetInfo(FServer, FName, 0, @Data.Value, ParmErr);
2015 if ErrorD = NERR_SUCCESS then begin
2016 S := FNetwork.Server[FServer];
2017 S.FGroupList[S.FGroupList.IndexOf(FName)] := Value;;
2018
2019 FName := Value;
2020 end else begin
2021 RaiseStWin32Error(EStNetException, ErrorD);
2022 end;
2023 finally
2024 StNetApiBufferFree(Data.Value);
2025 end;
2026 end;
2027 end;
2028 end;
2029 end;
2030
2031 procedure TStNetGroupItem.SetComment(Value: string);
2032 var
2033 ErrorD : DWord;
2034 Data : TLMWideChar;
2035 ParmErr : DWord;
2036 begin
2037 if Value <> FComment then begin
2038 case ItemType of
2039 nitGlobalGroup :
2040 begin
2041 Data.Value := nil;
2042 try
2043 CvtToWideCharLM(Value, Data);
2044 ErrorD := StNetGroupSetInfo(FServer, FName, 1002, @Data.Value, ParmErr);
2045 if ErrorD = NERR_SUCCESS then begin
2046 FComment := Value;
2047 end else begin
2048 RaiseStWin32Error(EStNetException, ErrorD);
2049 end;
2050 finally
2051 StNetApiBufferFree(Data.Value);
2052 end;
2053 end;
2054 nitLocalGroup :
2055 begin
2056 Data.Value := nil;
2057 try
2058 CvtToWideCharLM(Value, Data);
2059 ErrorD := StNetLocalGroupSetInfo(FServer, FName, 1002, @Data.Value, ParmErr);
2060 if ErrorD = NERR_SUCCESS then begin
2061 FComment := Value;
2062 end else begin
2063 RaiseStWin32Error(EStNetException, ErrorD);
2064 end;
2065 finally
2066 StNetApiBufferFree(Data.Value);
2067 end;
2068 end;
2069 end;
2070 end;
2071 end;
2072
2073 { --- TStNetServerItem ------------------------------------------------------ }
2074 constructor TStNetShareItem.CreateEx(AName, AComment, AServer: string;
2075 AShareType: TStNetShareType);
2076 begin
2077 inherited CreateEx(AName, AComment, AServer, nitShare);
2078 FShareType := AShareType;
2079 end;
2080
2081
2082 { --- TStNetServerItem ------------------------------------------------------ }
2083 constructor TStNetServerItem.CreateEx(AName, AComment: string);
2084 var
2085 ErrorD : DWord;
2086 begin
2087 inherited CreateEx(AName, AComment, AName, nitComputer);
2088 FUserList := TStringList.Create;
2089 FGroupList:= TStringList.Create;
2090 FDriveList:= TStringLIst.Create;
2091 FShareList:= TStringLIst.Create;
2092
2093 FServerData := nil;
2094 FServerMData0 := nil;
2095 FServerMData1 := nil;
2096 FServerMData2 := nil;
2097 FServerMData3 := nil;
2098
2099 ErrorD := StNetServerGetInfo(AName, 101, FServerData);
2100 if ErrorD = NERR_SUCCESS then begin
2101 with TSERVER_INFO_101(FServerData^) do begin
2102 FComment := sv101_comment;
2103 end;
2104 end else begin
2105 RaiseStWin32Error(EStNetException, ErrorD);
2106 end;
2107 end;
2108
2109 destructor TStNetServerItem.Destroy;
2110 var
2111 I : Integer;
2112 begin
2113 for I := 0 to FUserList.Count-1 do
2114 FUserList.Objects[I].Free;
2115 FUserList.Free;
2116
2117 for I := 0 to FGroupList.Count-1 do
2118 FGroupList.Objects[I].Free;
2119 FGroupList.Free;
2120
2121 FDriveList.Free;
2122
2123 for I := 0 to FShareList.Count-1 do
2124 FShareList.Objects[I].Free;
2125 FShareList.Free;
2126
2127 if FServerData <> nil then
2128 StNetApiBufferFree(FServerData);
2129
2130 if FServerMData0 <> nil then
2131 StNetApiBufferFree(FServerMData0);
2132
2133 if FServerMData1 <> nil then
2134 StNetApiBufferFree(FServerMData1);
2135
2136 if FServerMData2 <> nil then
2137 StNetApiBufferFree(FServerMData2);
2138
2139 if FServerMData3 <> nil then
2140 StNetApiBufferFree(FServerMData3);
2141
2142 inherited Destroy;
2143 end;
2144
2145 procedure TStNetServerItem.Refresh;
2146 var
2147 ErrorD : DWord;
2148 Data : Pointer;
2149 begin
2150 { refresh the base data }
2151 ErrorD := StNetServerGetInfo(FServer, 102, Data);
2152 if ErrorD = NERR_SUCCESS then begin
2153 if FServerData <> nil then
2154 StNetApiBufferFree(FServerData);
2155 FServerData := Data;
2156
2157 with TSERVER_INFO_102(FServerData^) do begin
2158 FComment := sv102_comment;
2159 end;
2160 end else begin
2161 RaiseStWin32Error(EStNetException, ErrorD);
2162 end;
2163
2164 { refresh the modal data }
2165 RefreshM0;
2166 RefreshM1;
2167 RefreshM2;
2168 RefreshM3;
2169 end;
2170
2171 procedure TStNetServerItem.RefreshM0;
2172 var
2173 ErrorD : DWord;
2174 Data : Pointer;
2175 begin
2176 { refresh the base data }
2177 ErrorD := StNetUserModalsGet(FServer, 0, Data);
2178 if ErrorD = NERR_SUCCESS then begin
2179 if FServerMData0 <> nil then
2180 StNetApiBufferFree(FServerMData0);
2181 FServerMData0 := Data;
2182 end else begin
2183 RaiseStWin32Error(EStNetException, ErrorD);
2184 end;
2185 end;
2186
2187 procedure TStNetServerItem.RefreshM1;
2188 var
2189 ErrorD : DWord;
2190 Data : Pointer;
2191 begin
2192 { refresh the base data }
2193 ErrorD := StNetUserModalsGet(FServer, 1, Data);
2194 if ErrorD = NERR_SUCCESS then begin
2195 if FServerMData1 <> nil then
2196 StNetApiBufferFree(FServerMData1);
2197 FServerMData1 := Data;
2198 end else begin
2199 RaiseStWin32Error(EStNetException, ErrorD);
2200 end;
2201 end;
2202
2203 procedure TStNetServerItem.RefreshM2;
2204 var
2205 ErrorD : DWord;
2206 Data : Pointer;
2207 begin
2208 { refresh the base data }
2209 ErrorD := StNetUserModalsGet(FServer, 2, Data);
2210 if ErrorD = NERR_SUCCESS then begin
2211 if FServerMData2 <> nil then
2212 StNetApiBufferFree(FServerMData2);
2213 FServerMData2 := Data;
2214 end else begin
2215 RaiseStWin32Error(EStNetException, ErrorD);
2216 end;
2217 end;
2218
2219 procedure TStNetServerItem.RefreshM3;
2220 var
2221 ErrorD : DWord;
2222 Data : Pointer;
2223 begin
2224 { refresh the base data }
2225 ErrorD := StNetUserModalsGet(FServer, 3, Data);
2226 if ErrorD = NERR_SUCCESS then begin
2227 if FServerMData3 <> nil then
2228 StNetApiBufferFree(FServerMData3);
2229 FServerMData3 := Data;
2230 end else begin
2231 RaiseStWin32Error(EStNetException, ErrorD);
2232 end;
2233 end;
2234
2235
2236 function TStNetServerItem.GetUser(AName: string): TStNetUserItem;
2237 var
2238 Index : Integer;
2239 ErrorD : DWord;
2240 Buffer : Pointer;
2241 begin
2242 Result := nil;
2243
2244 { look in the internal list first }
2245 Index := FUserList.IndexOf(AName);
2246
2247 if Index >= 0 then begin
2248 Result := TStNetUserItem(FUserList.Objects[Index]);
2249 end else begin
2250 { Need to find the user on the server }
2251 ErrorD := StNetUserGetInfo(FServer, AName, 1, Buffer);
2252
2253 { if the user existed on the server, then add that user to the list }
2254 { and return a reference to that object; otherwise return nil }
2255 if ErrorD = NERR_SUCCESS then begin
2256 Result := TStNetUserItem.CreateEx(AName, '', FServer, nitUnknown);
2257 Result.FNetwork := FNetwork;
2258
2259 StNetApiBufferFree(Buffer);
2260
2261 { Add this item to the internal list }
2262 FUserList.AddObject(AName, Result);
2263 end;
2264 end;
2265 end;
2266
2267 function TStNetServerItem.GetGroup(AName: string): TStNetGroupItem;
2268 var
2269 Index : Integer;
2270 ErrorD : DWord;
2271 Buffer : Pointer;
2272 begin
2273 Result := nil;
2274
2275 { look in the internal list first }
2276 Index := FGroupList.IndexOf(AName);
2277
2278 if Index >= 0 then begin
2279 Result := TStNetGroupItem(FGroupList.Objects[Index]);
2280 end else begin
2281
2282 { Need to find the group on the server }
2283 ErrorD := StNetGroupGetInfo(FServer, AName, 0, Buffer);
2284
2285 { if the group existed on the server, then add that group to the list }
2286 { and return a reference to that object; otherwise return nil }
2287 if ErrorD = NERR_SUCCESS then begin
2288 Result := TStNetGroupItem.CreateEx(AName, '', FServer, nitGlobalGroup);
2289 Result.FNetwork := FNetwork;
2290
2291 StNetApiBufferFree(Buffer);
2292
2293 { Add this item to the internal list }
2294 FGroupList.AddObject(AName, Result);
2295 end else if ErrorD = NERR_GroupNotFound then begin
2296 { cound be a local group }
2297 ErrorD := StNetLocalGroupGetInfo(FServer, AName, 1, Buffer);
2298
2299 if ErrorD = NERR_SUCCESS then begin
2300 Result := TStNetGroupItem.CreateEx(AName,
2301 TLocalGroup_Info_1(Buffer^).lgrpi1_comment, FServer, nitLocalGroup);
2302 Result.FNetwork := FNetwork;
2303
2304 StNetApiBufferFree(Buffer);
2305
2306 { Add this item to the internal list }
2307 FGroupList.AddObject(AName, Result);
2308 end else begin
2309 {RaiseStWin32Error(EStNetException, ErrorD);}
2310 end;
2311 end else begin
2312 {RaiseStWin32Error(EStNetException, ErrorD);}
2313 end;
2314 end;
2315 end;
2316
2317 function TStNetServerItem.GetDriveList: TStringList;
2318 type
2319 TDriveArray = array[0..MaxByte] of array[0..2] of WideChar;
2320 var
2321 NewList : TStringList;
2322 ErrorD : DWord;
2323 Index : Integer;
2324 Buffer : Pointer;
2325 EntriesRead : DWord;
2326 TotalEntries : DWord;
2327 MoreData : Boolean;
2328 NextIndex : DWord;
2329 begin
2330 NewList := TStringList.Create;
2331 MoreData := True;
2332 NextIndex := 0;
2333 try
2334 { get the list of drives from the server }
2335 while MoreData do begin
2336 ErrorD := StNetServerDiskEnum(FServer, 0, Buffer, DWord(-1), EntriesRead,
2337 TotalEntries, NextIndex);
2338 if ((ErrorD = NERR_SUCCESS) or (ErrorD = ERROR_MORE_DATA)) then begin
2339 try
2340 if EntriesRead > 0 then {!!.02}
2341 for Index := 0 to EntriesRead-1 do
2342 NewList.Add((TDriveArray(Buffer^)[Index]));
2343
2344 MoreData := (ErrorD = ERROR_MORE_DATA);
2345 finally
2346 StNetApiBufferFree(Buffer);
2347 end;
2348 end else begin
2349 RaiseStWin32Error(EStNetException, ErrorD);
2350 end;
2351 end;
2352 FDriveList.Assign(NewList);
2353 finally
2354 NewList.Free;
2355 end;
2356 Result := FDriveList as TStringList;
2357 end;
2358
2359 function TStNetServerItem.GetUserList: TStringList;
2360 var
2361 NewList : TStringList;
2362 ErrorD : DWord;
2363 Index : Integer;
2364 CurrentIndex : Integer;
2365 Buffer : Pointer;
2366 EntriesRead : DWord;
2367 NewItem : TStNetUserItem;
2368 MoreData : Boolean;
2369 NextIndex : DWord;
2370 begin
2371 NewList := TStringList.Create;
2372 MoreData := True;
2373 NextIndex := 0;
2374 try
2375 while MoreData do begin
2376 ErrorD := StNetQueryDisplayInformation(FServer, 1, NextIndex, DWord(-1),
2377 DWord(-1), EntriesRead, Buffer);
2378 if ((ErrorD = NERR_SUCCESS) or (ErrorD = ERROR_MORE_DATA)) then begin
2379 try
2380 if EntriesRead > 0 then begin {!!.02}
2381 for Index := 0 to EntriesRead-1 do begin
2382 { see if this user alread exists in the local list }
2383 CurrentIndex :=
2384 FUserList.IndexOf(TNetDisplayUserArray(Buffer^)[Index].usri1_name);
2385 if CurrentIndex >= 0 then
2386 NewItem := TStNetUserItem(FUserList.Objects[CurrentIndex])
2387 else begin
2388 NewItem :=
2389 TStNetUserItem.CreateExEnum(
2390 TNetDisplayUserArray(Buffer^)[Index].usri1_name,
2391 TNetDisplayUserArray(Buffer^)[Index].usri1_comment,
2392 FName,
2393 TNetDisplayUserArray(Buffer^)[Index].usri1_full_name,
2394 LongFlagIsSet(TNetDisplayUserArray(Buffer^)[Index].usri1_flags,
2395 UF_NORMAL_ACCOUNT),
2396 TNetDisplayUserArray(Buffer^)[Index].usri1_user_id);
2397 NewItem.FNetwork := FNetwork;
2398 end;
2399 NewList.AddObject(NewItem.Name, NewItem);
2400 NextIndex := TNetDisplayUserArray(Buffer^)[Index].usri1_next_index;
2401 end;
2402 end; {!!.02}
2403 MoreData := (ErrorD = ERROR_MORE_DATA);
2404 finally
2405 StNetApiBufferFree(Buffer);
2406 end;
2407 end else begin
2408 RaiseStWin32Error(EStNetException, ErrorD);
2409 end;
2410 end;
2411 FUserList.Assign(NewList);
2412 finally
2413 NewList.Free;
2414 end;
2415 Result := FUserList as TStringList;
2416 end;
2417
2418 function TStNetServerItem.GetGroupList : TStringList;
2419 var
2420 NewList : TStringList;
2421 ErrorD : DWord;
2422 Index : Integer;
2423 CurrentIndex : Integer;
2424 Buffer : Pointer;
2425 EntriesRead : DWord;
2426 TotalEntries : DWord;
2427 NewItem : TStNetGroupItem;
2428 MoreData : Boolean;
2429 NextIndex : DWord;
2430 begin
2431 NewList := TStringList.Create;
2432 MoreData := True;
2433 NextIndex := 0;
2434 try
2435 { Get the global list of groups from the server }
2436 while MoreData do begin
2437 ErrorD := StNetQueryDisplayInformation(FServer, 3, NextIndex, DWord(-1),
2438 DWord(-1), EntriesRead, Buffer);
2439 if ((ErrorD = NERR_SUCCESS) or (ErrorD = ERROR_MORE_DATA)) then begin
2440 try
2441 if EntriesRead > 0 then begin {!!.02}
2442 for Index := 0 to EntriesRead-1 do begin
2443 { see if this group already exists in the local list }
2444 CurrentIndex :=
2445 FGroupList.IndexOf(TNetDisplayGroupArray(Buffer^)[Index].grpi3_name);
2446 if CurrentIndex >= 0 then begin
2447 NewItem := TStNetGroupItem(FGroupList.Objects[CurrentIndex]);
2448 NewItem.FComment := TNetDisplayGroupArray(Buffer^)[Index].grpi3_comment;
2449 NewItem.FID := TNetDisplayGroupArray(Buffer^)[Index].grpi3_group_id;
2450 NewItem.FItemType := nitGlobalGroup;
2451 end else begin
2452 NewItem :=
2453 TStNetGroupItem.CreateExEnum(
2454 TNetDisplayGroupArray(Buffer^)[Index].grpi3_name,
2455 TNetDisplayGroupArray(Buffer^)[Index].grpi3_comment,
2456 FName,
2457 TNetDisplayGroupArray(Buffer^)[Index].grpi3_group_id);
2458 NewItem.FNetwork := FNetwork;
2459 end;
2460 NewList.AddObject(NewItem.Name, NewItem);
2461 NextIndex := TNetDisplayGroupArray(Buffer^)[Index].grpi3_next_index;
2462 end;
2463 end; {!!.02}
2464 MoreData := (ErrorD = ERROR_MORE_DATA);
2465 finally
2466 StNetApiBufferFree(Buffer);
2467 Buffer := nil;
2468 end;
2469 end else begin
2470 RaiseStWin32Error(EStNetException, ErrorD);
2471 end;
2472 end;
2473
2474 MoreData := True;
2475 NextIndex := 0;
2476 while MoreData do begin
2477 { get the local list of groups from the server }
2478 ErrorD := StNetLocalGroupEnum(FServer, 1, Buffer, DWord(-1), EntriesRead,
2479 TotalEntries, NextIndex);
2480 if ((ErrorD = NERR_SUCCESS) or (ErrorD = ERROR_MORE_DATA)) then begin
2481 try
2482 if EntriesRead > 0 then begin {!!.02}
2483 for Index := 0 to EntriesRead-1 do begin
2484 { see if this user alread exists in the local list }
2485 CurrentIndex :=
2486 FGroupList.IndexOf(TLocalGroupInfo1Array(Buffer^)[Index].lgrpi1_name);
2487 if CurrentIndex >= 0 then begin
2488 NewItem := TStNetGroupItem(FGroupList.Objects[CurrentIndex]);
2489 NewItem.FComment := TLocalGroupInfo1Array(Buffer^)[Index].lgrpi1_comment;
2490 NewItem.FID := 0;
2491 NewItem.FItemType := nitLocalGroup;
2492 end else begin
2493 NewItem :=
2494 TStNetGroupItem.CreateExEnum(
2495 TLocalGroupInfo1Array(Buffer^)[Index].lgrpi1_name,
2496 TLocalGroupInfo1Array(Buffer^)[Index].lgrpi1_comment,
2497 FName,
2498 0);
2499 NewItem.FNetwork := FNetwork;
2500 end;
2501 NewList.AddObject(NewItem.Name, NewItem);
2502 end;
2503 end; {!!.02}
2504 MoreData := (ErrorD = ERROR_MORE_DATA);
2505 finally
2506 StNetApiBufferFree(Buffer);
2507 end;
2508 end else begin
2509 RaiseStWin32Error(EStNetException, ErrorD);
2510 end;
2511 end;
2512
2513 FGroupList.Assign(NewList);
2514 finally
2515 NewList.Free;
2516 end;
2517 Result := FGroupList as TStringList;
2518 end;
2519
2520 function TStNetServerItem.GetShareList : TStringList;
2521 var
2522 NewList : TStringList;
2523 ErrorD : DWord;
2524 Index : Integer;
2525 CurrentIndex : Integer;
2526 Buffer : Pointer;
2527 EntriesRead : DWord;
2528 TotalEntries : DWord;
2529 NewItem : TStNetShareItem;
2530 NewShareType : TStNetShareType;
2531 MoreData : Boolean;
2532 NextIndex : DWord;
2533 begin
2534 NewList := TStringList.Create;
2535 MoreData := True;
2536 NextIndex := 0;
2537 try
2538 while MoreData do begin
2539 { Get the list of shares on the server }
2540 ErrorD := StNetShareEnum(FServer, 1, Buffer, DWord(-1), EntriesRead,
2541 TotalEntries, NextIndex);
2542 if ((ErrorD = NERR_SUCCESS) or (ErrorD = ERROR_MORE_DATA)) then begin
2543 try
2544 if EntriesRead > 0 then begin {!!.02}
2545 for Index := 0 to EntriesRead-1 do begin
2546 { see if this group already exists in the local list }
2547 CurrentIndex :=
2548 FShareList.IndexOf(TShareInfo1Array(Buffer^)[Index].shi1_netname);
2549 if CurrentIndex >= 0 then begin
2550 NewItem := TStNetShareItem(FShareList.Objects[CurrentIndex]);
2551 NewItem.FComment := TShareInfo1Array(Buffer^)[Index].shi1_remark;
2552 NewItem.FItemType := nitShare;
2553
2554 case TShareInfo1Array(Buffer^)[Index].shi1_type of
2555 STYPE_DISKTREE : NewItem.FShareType := stDisk;
2556 STYPE_PRINTQ : NewItem.FShareType := stPrint;
2557 STYPE_DEVICE : NewItem.FShareType := stDevice;
2558 STYPE_IPC : NewItem.FShareType := stIPC;
2559 STYPE_SPECIAL : NewItem.FShareType := stSpecial;
2560 else
2561 NewItem.FShareType := stUnknown;
2562 end;
2563 end else begin
2564 case TShareInfo1Array(Buffer^)[Index].shi1_type of
2565 STYPE_DISKTREE : NewShareType := stDisk;
2566 STYPE_PRINTQ : NewShareType := stPrint;
2567 STYPE_DEVICE : NewShareType := stDevice;
2568 STYPE_IPC : NewShareType := stIPC;
2569 STYPE_SPECIAL : NewShareType := stSpecial;
2570 else
2571 NewShareType := stUnknown;
2572 end;
2573
2574 NewItem :=
2575 TStNetShareItem.CreateEx(
2576 TShareInfo1Array(Buffer^)[Index].shi1_netname,
2577 TShareInfo1Array(Buffer^)[Index].shi1_remark,
2578 FServer,
2579 NewShareType);
2580 NewItem.FNetwork := FNetwork;
2581 end;
2582 NewList.AddObject(NewItem.Name, NewItem);
2583 end;
2584 end; {!!.02}
2585 MoreData := (ErrorD = ERROR_MORE_DATA);
2586 finally
2587 StNetApiBufferFree(Buffer);
2588 Buffer := nil;
2589 end;
2590 end else begin
2591 RaiseStWin32Error(EStNetException, ErrorD);
2592 end;
2593 end;
2594 FShareList.Assign(NewList);
2595 finally
2596 NewList.Free;
2597 end;
2598 Result := FShareList as TStringList;
2599 end;
2600
2601 function TStNetServerItem.AddGroup(AName, ADescription: string;
2602 AGlobal: Boolean): TStNetGroupItem;
2603 { Adds a group to the server }
2604 var
2605 Data : TLMWideChar;
2606 ErrorD : DWord;
2607 ParmErr : DWord;
2608 begin
2609 { does the group already exist ? }
2610 Result := Group[AName];
2611
2612 { if not, try creating it }
2613 if Result = nil then begin
2614 case AGlobal of
2615 True :
2616 begin
2617 Data.Value := nil;
2618 try
2619 CvtToWideCharLM(AName, Data);
2620 ErrorD := StNetGroupAdd(FServer, 0, @Data.Value, ParmErr);
2621 if ErrorD = NERR_SUCCESS then begin
2622 Result := TStNetGroupItem.CreateEx(AName, '', FServer, nitGlobalGroup);
2623 Result.FNetwork := FNetwork;
2624 Result.Comment := ADescription;
2625 end else begin
2626 RaiseStWin32Error(EStNetException, ErrorD);
2627 end;
2628 finally
2629 StNetApiBufferFree(Data.Value);
2630 end;
2631 end;
2632 False :
2633 begin
2634 Data.Value := nil;
2635 try
2636 CvtToWideCharLM(AName, Data);
2637 ErrorD := StNetLocalGroupAdd(FServer, 0, @Data.Value, ParmErr);
2638 if ErrorD = NERR_SUCCESS then begin
2639 Result := TStNetGroupItem.CreateEx(AName, '', FServer, nitLocalGroup);
2640 Result.FNetwork := FNetwork;
2641 Result.Comment := ADescription;
2642 end else begin
2643 RaiseStWin32Error(EStNetException, ErrorD);
2644 end;
2645 finally
2646 StNetApiBufferFree(Data.Value);
2647 end;
2648 end;
2649 end;
2650 end;
2651 end;
2652
2653 function TStNetServerItem.AddUser(AName, APassword: string;
2654 AGlobal: Boolean): TStNetUserItem;
2655 { Adds a user to the server }
2656 var
2657 Data : TUSER_INFO_1;
2658 ErrorD : DWord;
2659 ParmErr : DWord;
2660 ANameLen : DWord;
2661 APasswordLen : DWord;
2662 const
2663 IT : array[Boolean] of TStNetItemType = (nitGlobalUser, nitLocalUser);
2664 begin
2665 { does the user already exist ? }
2666 Result := User[AName];
2667
2668 { if not, try creating it }
2669 if Result = nil then begin
2670 FillChar(Data, SizeOf(Data), 0);
2671
2672 ANameLen := (Length(AName)+1) * 2;
2673 StNetApiBufferAllocate(ANameLen, Pointer(Data.usri1_name));
2674
2675 APasswordLen := (Length(APassword)+1) * 2;
2676 StNetApiBufferAllocate(APasswordLen, Pointer(Data.usri1_password));
2677 try
2678 StringToWideChar(AName, Data.usri1_name, ANameLen);
2679 StringToWideChar(APassword, Data.usri1_password, APasswordLen);
2680
2681 Data.usri1_priv := USER_PRIV_USER;
2682 Data.usri1_flags := UF_SCRIPT;
2683 if AGlobal then
2684 SetLongFlag(LongInt(Data.usri1_flags),
2685 UF_NORMAL_ACCOUNT)
2686 else
2687 SetLongFlag(LongInt(Data.usri1_flags),
2688 UF_TEMP_DUPLICATE_ACCOUNT);
2689
2690 ErrorD := StNetUserAdd(FServer, 1, @Data, ParmErr);
2691 if ErrorD = NERR_SUCCESS then begin
2692 Result := TStNetUserItem.CreateEx(AName, '', FServer, IT[AGlobal]);
2693 Result.FNetwork := FNetwork;
2694 end else begin
2695 RaiseStWin32Error(EStNetException, ErrorD);
2696 end;
2697 finally
2698 StNetApiBufferFree(Data.usri1_password);
2699 StNetApiBufferFree(Data.usri1_name);
2700 end;
2701 end;
2702 end;
2703
2704 procedure TStNetServerItem.SetComment(Value: string);
2705 var
2706 Data : TLMWideChar;
2707 ErrorD : DWord;
2708 ParmErr : DWord;
2709 begin
2710 if Value <> Comment then begin
2711 Data.Value := nil;
2712 try
2713 CvtToWideCharLM(Value, Data);
2714 ErrorD := StNetServerSetInfo(FServer, 1005, @Data.Value, ParmErr);
2715 if ErrorD = NERR_SUCCESS then begin
2716 StNetApiBufferFree(TSERVER_INFO_101(FServerData^).sv101_comment);
2717 TSERVER_INFO_101(FServerData^).sv101_comment := Data.Value;
2718 FComment := Data.Value;
2719 end else begin
2720 RaiseStWin32Error(EStNetException, ErrorD);
2721 end;
2722 except
2723 StNetApiBufferFree(Data.Value);
2724 raise;
2725 end;
2726 end;
2727 end;
2728
2729 function TStNetServerItem.GetAnnounceRate: DWord;
2730 begin
2731 if FServerData = nil then
2732 Refresh;
2733 Result := TSERVER_INFO_102(FServerData^).sv102_announce;
2734 end;
2735
2736 function TStNetServerItem.GetAnnounceRateDelta: DWord;
2737 begin
2738 if FServerData = nil then
2739 Refresh;
2740 Result := TSERVER_INFO_102(FServerData^).sv102_anndelta;
2741 end;
2742
2743 function TStNetServerItem.GetDisconnectTime: DWord;
2744 begin
2745 if FServerData = nil then
2746 Refresh;
2747 Result := TSERVER_INFO_102(FServerData^).sv102_disc;
2748 end;
2749
2750 function TStNetServerItem.GetMaxUsers: DWord;
2751 begin
2752 if FServerData = nil then
2753 Refresh;
2754 Result := TSERVER_INFO_102(FServerData^).sv102_users;
2755 end;
2756
2757 function TStNetServerItem.GetPlatform: TStNetServerPlatformType;
2758 begin
2759 if FServerData = nil then
2760 Refresh;
2761
2762 Result := sptUnknown;
2763 case TSERVER_INFO_102(FServerData^).sv102_platform_id of
2764 PLATFORM_ID_DOS : Result := sptDOS;
2765 PLATFORM_ID_OS2 : Result := sptOS2;
2766 PLATFORM_ID_NT : Result := sptNT;
2767 PLATFORM_ID_OSF : Result := sptOSF;
2768 PLATFORM_ID_VMS : Result := sptVMS;
2769 end;
2770 end;
2771
2772 function TStNetServerItem.GetServerType: TStNetServerSet;
2773 begin
2774 if FServerData = nil then
2775 Refresh;
2776
2777 Result := [];
2778 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_WORKSTATION) then
2779 Include(Result, nsvtWorkstation);
2780 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_SERVER) then
2781 Include(Result, nsvtServer);
2782 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_SQLSERVER) then
2783 Include(Result, nsvtSQLServer);
2784 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_DOMAIN_CTRL) then
2785 Include(Result, nsvtDomainCtrl);
2786 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_DOMAIN_BAKCTRL) then
2787 Include(Result, nsvtDomainBackupCtrl);
2788 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_TIME_SOURCE) then
2789 Include(Result, nsvtTimeSource);
2790 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_AFP) then
2791 Include(Result, nsvtAFP);
2792 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_NOVELL) then
2793 Include(Result, nsvtNovell);
2794 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_DOMAIN_MEMBER) then
2795 Include(Result, nsvtDomainMember);
2796 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_PRINTQ_SERVER) then
2797 Include(Result, nsvtPrintQServer);
2798 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_DIALIN_SERVER) then
2799 Include(Result, nsvtDialinServer);
2800 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_XENIX_SERVER) then
2801 Include(Result, nsvtUNIXServer);
2802 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_SERVER_UNIX) then
2803 Include(Result, nsvtUNIXServer);
2804 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_NT) then
2805 Include(Result, nsvtNT);
2806 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_WFW) then
2807 Include(Result, nsvtWFW);
2808 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_SERVER_MFPN) then
2809 Include(Result, nsvtMFPN);
2810 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_SERVER_NT) then
2811 Include(Result, nsvtServerNT);
2812 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_POTENTIAL_BROWSER) then
2813 Include(Result, nsvtPotentialBrowser);
2814 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_BACKUP_BROWSER) then
2815 Include(Result, nsvtBackupBrowser);
2816 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_MASTER_BROWSER) then
2817 Include(Result, nsvtMasterBrowser);
2818 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_DOMAIN_MASTER) then
2819 Include(Result, nsvtDomainMaster);
2820 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_SERVER_OSF) then
2821 Include(Result, nsvtOSF);
2822 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_SERVER_VMS) then
2823 Include(Result, nsvtVMS);
2824 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_WINDOWS) then
2825 Include(Result, nsvtWindows);
2826 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_DFS) then
2827 Include(Result, nsvtDFS);
2828 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_CLUSTER_NT) then
2829 Include(Result, nsvtClusterNT);
2830 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_TERMINALSERVER) then
2831 Include(Result, nsvtTerminalServer);
2832 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_DCE) then
2833 Include(Result, nsvtDCE);
2834 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_ALTERNATE_XPORT) then
2835 Include(Result, nsvtAlternateXPORT);
2836 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, SV_TYPE_LOCAL_LIST_ONLY) then
2837 Include(Result, nsvtLocalListOnly);
2838 if LongFlagIsSet(TSERVER_INFO_102(FServerData^).sv102_type, LongInt(SV_TYPE_DOMAIN_ENUM)) then
2839 Include(Result, nsvtDomainEnum);
2840 end;
2841
2842 function TStNetServerItem.GetUserPath: string;
2843 begin
2844 if FServerData = nil then
2845 Refresh;
2846 Result := TSERVER_INFO_102(FServerData^).sv102_userpath;
2847 end;
2848
2849 function TStNetServerItem.GetVersion: DWord;
2850 begin
2851 if FServerData = nil then
2852 Refresh;
2853 Result := MakeLong(TSERVER_INFO_102(FServerData^).sv102_version_major,
2854 TSERVER_INFO_102(FServerData^).sv102_version_minor);
2855 end;
2856
2857 function TStNetServerItem.GetVisible: Boolean;
2858 begin
2859 if FServerData = nil then
2860 Refresh;
2861 Result := not Boolean(TSERVER_INFO_102(FServerData^).sv102_hidden);
2862 end;
2863
2864 procedure TStNetServerItem.SetAnnounceRate(Value: DWord);
2865 var
2866 ErrorD : DWord;
2867 ParmErr : DWord;
2868 begin
2869 if Value <> AnnounceRate then begin
2870 ErrorD := StNetServerSetInfo(FServer, 1017, @Value, ParmErr);
2871 if ErrorD = NERR_SUCCESS then begin
2872 TSERVER_INFO_102(FServerData^).sv102_announce := Value;
2873 end else begin
2874 RaiseStWin32Error(EStNetException, ErrorD);
2875 end;
2876 end;
2877 end;
2878
2879 procedure TStNetServerItem.SetAnnounceRateDelta(Value: DWord);
2880 var
2881 ErrorD : DWord;
2882 ParmErr : DWord;
2883 begin
2884 if Value <> AnnounceRateDelta then begin
2885 ErrorD := StNetServerSetInfo(FServer, 1018, @Value, ParmErr);
2886 if ErrorD = NERR_SUCCESS then begin
2887 TSERVER_INFO_102(FServerData^).sv102_anndelta := Value;
2888 end else begin
2889 RaiseStWin32Error(EStNetException, ErrorD);
2890 end;
2891 end;
2892 end;
2893
2894 procedure TStNetServerItem.SetDisconnectTime(Value: DWord);
2895 var
2896 ErrorD : DWord;
2897 ParmErr : DWord;
2898 begin
2899 if Value <> DisconnectTime then begin
2900 ErrorD := StNetServerSetInfo(FServer, 1010, @Value, ParmErr);
2901 if ErrorD = NERR_SUCCESS then begin
2902 TSERVER_INFO_102(FServerData^).sv102_disc := Value;
2903 end else begin
2904 RaiseStWin32Error(EStNetException, ErrorD);
2905 end;
2906 end;
2907 end;
2908
2909 procedure TStNetServerItem.SetMaxUsers(Value: DWord);
2910 var
2911 ErrorD : DWord;
2912 ParmErr : DWord;
2913 begin
2914 if Value <> MaxUsers then begin
2915 ErrorD := StNetServerSetInfo(FServer, 1107, @Value, ParmErr);
2916 if ErrorD = NERR_SUCCESS then begin
2917 TSERVER_INFO_102(FServerData^).sv102_users := Value;
2918 end else begin
2919 RaiseStWin32Error(EStNetException, ErrorD);
2920 end;
2921 end;
2922 end;
2923
2924 procedure TStNetServerItem.SetVisible(Value: Boolean);
2925 var
2926 ErrorD : DWord;
2927 ParmErr : DWord;
2928 begin
2929 if Value <> Visible then begin
2930 ErrorD := StNetServerSetInfo(FServer, 1016, @Value, ParmErr);
2931 if ErrorD = NERR_SUCCESS then begin
2932 TSERVER_INFO_102(FServerData^).sv102_hidden := not Value;
2933 end else begin
2934 RaiseStWin32Error(EStNetException, ErrorD);
2935 end;
2936 end;
2937 end;
2938
2939 function TStNetServerItem.GetMinPasswordLen: DWord;
2940 begin
2941 if FServerMData0 = nil then
2942 RefreshM0;
2943 Result := TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_min_passwd_len;
2944 end;
2945
2946 function TStNetServerItem.GetMaxPasswordAge: DWord;
2947 begin
2948 if FServerMData0 = nil then
2949 RefreshM0;
2950 Result := TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_max_passwd_age;
2951 end;
2952
2953 function TStNetServerItem.GetMinPasswordAge: DWord;
2954 begin
2955 if FServerMData0 = nil then
2956 RefreshM0;
2957 Result := TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_min_passwd_age;
2958 end;
2959
2960 function TStNetServerItem.GetForceLogoff: TStTime;
2961 begin
2962 if FServerMData0 = nil then
2963 RefreshM0;
2964 Result := TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_force_logoff;
2965 end;
2966
2967 function TStNetServerItem.GetPasswordHistoryLength: DWord;
2968 begin
2969 if FServerMData0 = nil then
2970 RefreshM0;
2971 Result := TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_password_hist_len;
2972 end;
2973
2974 function TStNetServerItem.GetRole: TStNetServerRoleType;
2975 begin
2976 if FServerMData1 = nil then
2977 RefreshM1;
2978
2979 Result := srtUnknown;
2980 case TUSER_MODALS_INFO_1(FServerMData1^).usrmod1_role of
2981 UAS_ROLE_STANDALONE : Result := srtStandAlone;
2982 UAS_ROLE_MEMBER : Result := srtMember;
2983 UAS_ROLE_BACKUP : Result := srtBackup;
2984 UAS_ROLE_PRIMARY : Result := strPrimary;
2985 end;
2986 end;
2987
2988 function TStNetServerItem.GetPrimaryDC: string;
2989 begin
2990 if FServerMData1 = nil then
2991 RefreshM1;
2992 Result := TUSER_MODALS_INFO_1(FServerMData1^).usrmod1_primary;
2993 end;
2994
2995 function TStNetServerItem.GetDomainName: string;
2996 begin
2997 if FServerMData2 = nil then
2998 RefreshM2;
2999 Result := TUSER_MODALS_INFO_2(FServerMData2^).usrmod2_domain_name;
3000 end;
3001
3002 function TStNetServerItem.GetDomainSid : TStSidRecord;
3003 var
3004 Index : Integer;
3005 begin
3006 if FServerMData2 = nil then
3007 RefreshM2;
3008
3009 Result.Value := TUSER_MODALS_INFO_2(FServerMData2^).usrmod2_domain_id;
3010 Result.Usage := nstDomain;
3011 Result.Length:= High(DWord);
3012
3013 Result.ValueS :=
3014 Format('S-1-%d',
3015 [TSIDIdentifierAuthority(StGetSidIdentifierAuthority(Result.Value)^).Value[5]]);
3016
3017 for Index := 0 to StGetSidSubAuthorityCount(Result.Value) - 1 do begin
3018 Result.ValueS :=
3019 Format(Result.ValueS + '-%d', [StGetSidSubAuthority(Result.Value, Index)]);
3020 end;
3021 end;
3022
3023 function TStNetServerItem.GetLockOutDuration : DWord;
3024 begin
3025 if FServerMData3 = nil then
3026 RefreshM3;
3027 Result := TUSER_MODALS_INFO_3(FServerMData3^).usrmod3_lockout_duration;
3028 end;
3029
3030 function TStNetServerItem.GetLockoutObservationWindow: DWord;
3031 begin
3032 if FServerMData3 = nil then
3033 RefreshM3;
3034 Result := TUSER_MODALS_INFO_3(FServerMData3^).usrmod3_lockout_observation_window;
3035 end;
3036
3037 function TStNetServerItem.GetLockoutThreshold: DWord;
3038 begin
3039 if FServerMData3 = nil then
3040 RefreshM3;
3041 Result := TUSER_MODALS_INFO_3(FServerMData3^).usrmod3_lockout_threshold;
3042 end;
3043
3044 procedure TStNetServerItem.SetMinPasswordLen(Value: DWord);
3045 var
3046 ErrorD : DWord;
3047 ParmErr : DWord;
3048 begin
3049 if Value <> MinPasswordLen then begin
3050 ErrorD := StNetUserModalsSet(FServer, 1001, @Value, ParmErr);
3051 if ErrorD = NERR_SUCCESS then begin
3052 TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_min_passwd_len := Value;
3053 end else begin
3054 RaiseStWin32Error(EStNetException, ErrorD);
3055 end;
3056 end;
3057 end;
3058
3059 procedure TStNetServerItem.SetMaxPasswordAge(Value: DWord);
3060 var
3061 ErrorD : DWord;
3062 ParmErr : DWord;
3063 begin
3064 if Value <> MaxPasswordAge then begin
3065 ErrorD := StNetUserModalsSet(FServer, 1002, @Value, ParmErr);
3066 if ErrorD = NERR_SUCCESS then begin
3067 TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_max_passwd_age := Value;
3068 end else begin
3069 RaiseStWin32Error(EStNetException, ErrorD);
3070 end;
3071 end;
3072 end;
3073
3074 procedure TStNetServerItem.SetMinPasswordAge(Value: DWord);
3075 var
3076 ErrorD : DWord;
3077 ParmErr : DWord;
3078 begin
3079 if Value <> MinPasswordAge then begin
3080 ErrorD := StNetUserModalsSet(FServer, 1003, @Value, ParmErr);
3081 if ErrorD = NERR_SUCCESS then begin
3082 TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_min_passwd_age := Value;
3083 end else begin
3084 RaiseStWin32Error(EStNetException, ErrorD);
3085 end;
3086 end;
3087 end;
3088
3089 procedure TStNetServerItem.SetForceLogoff(Value: TStTime);
3090 var
3091 ErrorD : DWord;
3092 ParmErr : DWord;
3093 begin
3094 if Value <> ForceLogoff then begin
3095 ErrorD := StNetUserModalsSet(FServer, 1004, @Value, ParmErr);
3096 if ErrorD = NERR_SUCCESS then begin
3097 TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_force_logoff := Value;
3098 end else begin
3099 RaiseStWin32Error(EStNetException, ErrorD);
3100 end;
3101 end;
3102 end;
3103
3104 procedure TStNetServerItem.SetPasswordHistoryLength(Value: DWord);
3105 var
3106 ErrorD : DWord;
3107 ParmErr : DWord;
3108 begin
3109 if Value <> PasswordHistoryLength then begin
3110 ErrorD := StNetUserModalsSet(FServer, 1005, @Value, ParmErr);
3111 if ErrorD = NERR_SUCCESS then begin
3112 TUSER_MODALS_INFO_0(FServerMData0^).usrmod0_password_hist_len := Value;
3113 end else begin
3114 RaiseStWin32Error(EStNetException, ErrorD);
3115 end;
3116 end;
3117 end;
3118
3119 procedure TStNetServerItem.SetLockOutDuration(Value: DWord);
3120 var
3121 Data : TUSER_MODALS_INFO_3;
3122 ErrorD : DWord;
3123 ParmErr : DWord;
3124 begin
3125 if Value <> LockOutDuration then begin
3126 Data.usrmod3_lockout_duration := Value;
3127 Data.usrmod3_lockout_observation_window := LockoutObservationWindow;
3128 Data.usrmod3_lockout_threshold := LockoutThreshold;
3129
3130 ErrorD := StNetUserModalsSet(FServer, 3, @Data, ParmErr);
3131 if ErrorD = NERR_SUCCESS then begin
3132 TUSER_MODALS_INFO_3(FServerMData3^).usrmod3_lockout_duration := Value;
3133 end else begin
3134 RaiseStWin32Error(EStNetException, ErrorD);
3135 end;
3136 end;
3137 end;
3138
3139 procedure TStNetServerItem.SetLockoutObservationWindow(Value: DWord);
3140 var
3141 Data : TUSER_MODALS_INFO_3;
3142 ErrorD : DWord;
3143 ParmErr : DWord;
3144 begin
3145 if Value <> LockoutObservationWindow then begin
3146 Data.usrmod3_lockout_duration := LockOutDuration;
3147 Data.usrmod3_lockout_observation_window := Value;
3148 Data.usrmod3_lockout_threshold := LockoutThreshold;
3149
3150 ErrorD := StNetUserModalsSet(FServer, 3, @Data, ParmErr);
3151 if ErrorD = NERR_SUCCESS then begin
3152 TUSER_MODALS_INFO_3(FServerMData3^).usrmod3_lockout_observation_window := Value;
3153 end else begin
3154 RaiseStWin32Error(EStNetException, ErrorD);
3155 end;
3156 end;
3157 end;
3158
3159 procedure TStNetServerItem.SetLockoutThreshold(Value: DWord);
3160 var
3161 Data : TUSER_MODALS_INFO_3;
3162 ErrorD : DWord;
3163 ParmErr : DWord;
3164 begin
3165 if Value <> LockoutThreshold then begin
3166 Data.usrmod3_lockout_duration := LockOutDuration;
3167 Data.usrmod3_lockout_observation_window := LockoutObservationWindow;
3168 Data.usrmod3_lockout_threshold := Value;
3169
3170 ErrorD := StNetUserModalsSet(FServer, 3, @Data, ParmErr);
3171 if ErrorD = NERR_SUCCESS then begin
3172 TUSER_MODALS_INFO_3(FServerMData3^).usrmod3_lockout_threshold := Value;
3173 end else begin
3174 RaiseStWin32Error(EStNetException, ErrorD);
3175 end;
3176 end;
3177 end;
3178
3179 { --- TStNetwork ------------------------------------------------------------ }
3180 constructor TStNetwork.Create;
3181 begin
3182 inherited Create;
3183 FList := TStringList.Create;
3184 end;
3185
3186 destructor TStNetwork.Destroy;
3187 var
3188 I : Integer;
3189 begin
3190 for I := 0 to FList.Count-1 do
3191 FList.Objects[I].Free;
3192
3193 FList.Free;
3194 inherited Destroy;
3195 end;
3196
3197 function TStNetwork.GetServer(AServer: string): TStNetServerItem;
3198 var
3199 Index : Integer;
3200 ErrorD: DWord;
3201 Buffer : Pointer;
3202 begin
3203 if Trim(AServer) = '' then begin
3204 ErrorD := StNetServerGetInfo('', 100, Buffer);
3205 if ErrorD = NERR_SUCCESS then begin
3206 try
3207 AServer := TSERVER_INFO_100(Buffer^).sv100_name;
3208 finally
3209 StNetApiBufferFree(Buffer);
3210 Buffer := nil;
3211 end;
3212 end else begin
3213 RaiseStWin32Error(EStNetException, ErrorD);
3214 end;
3215 end;
3216
3217 { look in the internal list first }
3218 Index := FList.IndexOf(AServer);
3219 if Index >= 0 then begin
3220 Result := TStNetServerItem(FList.Objects[Index]);
3221 end else begin
3222 Result := TStNetServerItem.CreateEx(AServer, '');
3223 Result.FNetwork := Self;
3224
3225 { Add this item to the internal list }
3226 FList.AddObject(AServer, Result);
3227 end;
3228 end;
3229
3230 function TStNetwork.GetUser(AServer, AName: string): TStNetUserItem;
3231 var
3232 S : TStNetServerItem;
3233 begin
3234 Result := nil;
3235
3236 { we first need the server that this user is on }
3237 S := Server[AServer];
3238
3239 if (S <> nil) then
3240 { now that we have the server, get the user from it }
3241 Result := S.User[AName];
3242 end;
3243
3244 function TStNetwork.GetGroup(AServer, AName: string): TStNetGroupItem;
3245 var
3246 S : TStNetServerItem;
3247 begin
3248 Result := nil;
3249
3250 { we first need the server that this group is on }
3251 S := Server[AServer];
3252
3253 if (S <> nil) then
3254 { now that we have the server, get the group from it }
3255 Result := S.Group[AName];
3256 end;
3257
3258 function TStNetwork.GetPrimaryDC(ADomain: string): TStNetServerItem;
3259 var
3260 Buffer : string;
3261 ErrorD : DWord;
3262 begin
3263 Result := nil;
3264
3265 { lookup the domain }
3266 ErrorD := StNetGetDCName('', ADomain, Buffer);
3267 if ErrorD = NERR_SUCCESS then begin
3268 { get this server from the list }
3269 Result := Server[FilterL(Buffer, '\')];
3270 end else begin
3271 RaiseStWin32Error(EStNetException, ErrorD);
3272 end;
3273 end;
3274
3275 { --------------------------------------------------------------------------- }
3276
3277 initialization
3278 StNetwork := TStNetwork.Create;
3279 finalization
3280 StNetwork.Free
3281 end.

  ViewVC Help
Powered by ViewVC 1.1.20