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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2671 - (hide annotations) (download)
Tue Aug 25 18:15:15 2015 UTC (8 years, 10 months ago) by torben
File size: 105794 byte(s)
Added tpsystools component
1 torben 2671 // 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