Named Pipe Access Denied még egyszer

Named Pipe Access Denied még egyszer
2011-10-25T12:01:58+02:00
2011-12-08T12:35:08+01:00
2022-11-23T23:41:55+01:00
Herényi István
Egy Microsoft dokumentumban olvastam, hogy egy szervizzel való kommunikálás egyik legjobb módja a pipe.
Írtam egy szervizt és egy programot, amelyik kommunikál vele. Az egész Windows XP alatt kiválóan működik.
Ha Windows 7 alatt akarom használni, akkor a szerviz (a pipe server) hibátlanul elindul, de a vele kommunikálni kívánó program nem tudja a pipe-ot megnyitni, mert Access denied (kódja: 5) hibajelzést kap. Ha ugyanezt a programot a "Futtatás rendszergazdaként" módon indítom, ismét rendben van minden.
Egy nem rendszergazdaként indított program Windows 7 alatt nem tud pipe-on keresztül szervizzel kommunikálni?
Meg lehet azt tenni, hogy a program eleve rendszergazdaként induljon? Hogyan?
Mutasd a teljes hozzászólást!
Megtaláltam a megoldást. Készítettem olyan Security Attribute-t, amellyel a pipe már elfogadja bárki kapcsolatfelvevési kísérletét.
A közölt példa sok "felesleget" is tartalmaz, azonban ezek hasznosak lehetnek (konstansok, stb.), ha valakinek ettől kissé eltérőbb Attribute-re lenne szüksége:

unit AclUnit; interface Uses Windows; Var SECURITYATTRIBUTES: SECURITY_ATTRIBUTES; implementation Uses SysUtils, ACLAPI, AccCtrl; Const SECURITY_MAX_SID_SIZE = 68; SECURITY_WORLD_RID = $00000000; SECURITY_BUILTIN_DOMAIN_RID = $00000020; DOMAIN_ALIAS_RID_ADMINS = $00000220; MAXIMUM_ALLOWED = $2000000; DELETE = $10000; READ_CONTROL = $20000; WRITE_DAC = $40000; WRITE_OWNER = $80000; SYNCHRONIZE = $100000; STANDARD_RIGHTS_READ = READ_CONTROL; STANDARD_RIGHTS_WRITE = READ_CONTROL; STANDARD_RIGHTS_EXECUTE = READ_CONTROL; STANDARD_RIGHTS_REQUIRED = $F0000; FILE_READ_DATA = $1; // ' file & pipe FILE_LIST_DIRECTORY = $1; // ' directory FILE_ADD_FILE = $2; // ' directory FILE_WRITE_DATA = $2; // ' file & pipe FILE_CREATE_PIPE_INSTANCE = $4; // ' named pipe FILE_ADD_SUBDIRECTORY = $4; // ' directory FILE_APPEND_DATA = $4; // ' file FILE_READ_EA = $8; // ' file & directory FILE_READ_PROPERTIES = FILE_READ_EA; // FILE_WRITE_EA = $10; // ' file & directory FILE_WRITE_PROPERTIES = FILE_WRITE_EA; // FILE_EXECUTE = $20; // ' file FILE_TRAVERSE = $20; // ' directory FILE_DELETE_CHILD = $40; // ' directory FILE_READ_ATTRIBUTES = $80; // ' all FILE_WRITE_ATTRIBUTES = $100; // ' all FILE_GENERIC_READ = (STANDARD_RIGHTS_READ Or FILE_READ_DATA Or FILE_READ_ATTRIBUTES Or FILE_READ_EA Or SYNCHRONIZE); FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE Or FILE_WRITE_DATA Or FILE_WRITE_ATTRIBUTES Or FILE_WRITE_EA Or FILE_APPEND_DATA Or SYNCHRONIZE); FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE Or FILE_READ_ATTRIBUTES Or FILE_EXECUTE Or SYNCHRONIZE); FILE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or $01FF); GENERIC_READ = $80000000; GENERIC_WRITE = $40000000; GENERIC_EXECUTE = $20000000; GENERIC_ALL = $10000000; Type WELL_KNOWN_SID_TYPE = ( WinNullSid = 0, WinWorldSid = 1, WinLocalSid = 2, WinCreatorOwnerSid = 3, WinCreatorGroupSid = 4, WinCreatorOwnerServerSid = 5, WinCreatorGroupServerSid = 6, WinNtAuthoritySid = 7, WinDialupSid = 8, WinNetworkSid = 9, WinBatchSid = 10, WinInteractiveSid = 11, WinServiceSid = 12, WinAnonymousSid = 13, WinProxySid = 14, WinEnterpriseControllersSid = 15, WinSelfSid = 16, WinAuthenticatedUserSid = 17, WinRestrictedCodeSid = 18, WinTerminalServerSid = 19, WinRemoteLogonIdSid = 20, WinLogonIdsSid = 21, WinLocalSystemSid = 22, WinLocalServiceSid = 23, WinNetworkServiceSid = 24, WinBuiltinDomainSid = 25, WinBuiltinAdministratorsSid = 26, WinBuiltinUsersSid = 27, WinBuiltinGuestsSid = 28, WinBuiltinPowerUsersSid = 29, WinBuiltinAccountOperatorsSid = 30, WinBuiltinSystemOperatorsSid = 31, WinBuiltinPrintOperatorsSid = 32, WinBuiltinBackupOperatorsSid = 33, WinBuiltinReplicatorSid = 34, WinBuiltinPreWindows2000CompatibleAccessSid = 35, WinBuiltinRemoteDesktopUsersSid = 36, WinBuiltinNetworkConfigurationOperatorsSid = 37, WinAccountAdministratorSid = 38, WinAccountGuestSid = 39, WinAccountKrbtgtSid = 40, WinAccountDomainAdminsSid = 41, WinAccountDomainUsersSid = 42, WinAccountDomainGuestsSid = 43, WinAccountComputersSid = 44, WinAccountControllersSid = 45, WinAccountCertAdminsSid = 46, WinAccountSchemaAdminsSid = 47, WinAccountEnterpriseAdminsSid = 48, WinAccountPolicyAdminsSid = 49, WinAccountRasAndIasServersSid = 50, WinNTLMAuthenticationSid = 51, WinDigestAuthenticationSid = 52, WinSChannelAuthenticationSid = 53, WinThisOrganizationSid = 54, WinOtherOrganizationSid = 55, WinBuiltinIncomingForestTrustBuildersSid = 56, WinBuiltinPerfMonitoringUsersSid = 57, WinBuiltinPerfLoggingUsersSid = 58, WinBuiltinAuthorizationAccessSid = 59, WinBuiltinTerminalServerLicenseServersSid = 60, WinBuiltinDCOMUsersSid = 61, WinBuiltinIUsersSid = 62, WinIUserSid = 63, WinBuiltinCryptoOperatorsSid = 64, WinUntrustedLabelSid = 65, WinLowLabelSid = 66, WinMediumLabelSid = 67, WinHighLabelSid = 68, WinSystemLabelSid = 69, WinWriteRestrictedCodeSid = 70, WinCreatorOwnerRightsSid = 71, WinCacheablePrincipalsGroupSid = 72, WinNonCacheablePrincipalsGroupSid = 73, WinEnterpriseReadonlyControllersSid = 74, WinAccountReadonlyControllersSid = 75, WinBuiltinEventLogReadersGroup = 76, WinNewEnterpriseReadonlyControllersSid = 77, WinBuiltinCertSvcDComAccessGroup = 78, WinMediumPlusLabelSid = 79, WinLocalLogonSid = 80, WinConsoleLogonSid = 81, WinThisOrganizationCertificateSid = 82, WinApplicationPackageAuthoritySid = 83, WinBuiltinAnyPackageSid = 84, WinCapabilityInternetClientSid = 85, WinCapabilityInternetClientServerSid = 86, WinCapabilityPrivateNetworkClientServerSid = 87, WinCapabilityPicturesLibrarySid = 88, WinCapabilityVideosLibrarySid = 89, WinCapabilityMusicLibrarySid = 90, WinCapabilityDocumentsLibrarySid = 91, WinCapabilitySharedUserCertificatesSid = 92, WinCapabilityDefaultWindowsCredentialsSid = 93, WinCapabilityRemovableStorageSid = 94 ); Const SECURITY_WORLD_SID_AUTHORITY : TSIDIdentifierAuthority = (Value:(0,0,0,0,0,1)); SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); Var pEveryoneSID: PSID; ACL: PACL; pSD: PSECURITY_DESCRIPTOR; procedure WriteLog(S: String); Var FN: String; F: TextFile; Begin FN := ChangeFileExt(ParamStr(0), '.LOG'); AssignFile(F, FN); if FileExists(FN) then Append(F) else Rewrite(F); WriteLn(F, FormatDateTime('yyyy/mm/dd hh:nn:ss.zzz ', Now), S); CloseFile(F); End; procedure Init; Var SIDAuthWorld: TSIDIdentifierAuthority; EA: EXPLICIT_ACCESS_A; E: Integer; dwRes: DWORD; Begin SIDAuthWorld:= SECURITY_WORLD_SID_AUTHORITY; if not AllocateAndInitializeSid(SIDAuthWorld, 1,
Mutasd a teljes hozzászólást!

  • Valószínűleg az a gond, hogy a pipe létrehozásakor nem határozol meg egyéni DACL-t (discretionary access control list) és ezért az alapértelmezett DACL lép életbe. Az egészet megfejeli az, hogy a szervíz alighanem valamilyen magas jogosultsággal rendelkező felhasználó (pl. local system) nevében fut, míg az asztali program valszeg limitált felhasználói üzemmódban, ezért a szervíz által létrehozott named pipe alapértelmezett DACL-je túl szigorú lesz a felhasználói hozzáféréshez.

    Egy kis alap információ a DACL-ről itt

    Itt részletesen magyarázzák a hátteret (a kód viszont c#), de itt delphi-s példakódot és linkeket(!!!!) találsz, csak a magyarázat kevesebb. Itt egy alternatív delphi-s példakód.
    Mutasd a teljes hozzászólást!
  • Köszönöm a gyors választ, a küldött linkeket át fogom tanulmányozni. Igazad van, nem határozok meg egyéni DACL-t.

    Viszont azt olvasom, hogy:
    If the object does not have a discretionary access control list (DACL), the system grants access;

    Az egyik linknél pedig:
    This code already assigns a null DACL to the security attributes. That means everybody can do anything to whatever object it's associated with.

    Úgy érzem, hogy a tapasztalat ennek ellent mond, vagy máshol van a hiba.
    Mutasd a teljes hozzászólást!
  • Ez a 2 kijelentés a windows xp-re igaz, windows vista-tól kezdve nem. Ezért írtam, hogy az elméleti hátteret az 1. linken olvasd, ahol a c#-os kód van.
    Mutasd a teljes hozzászólást!
  • Azért nem válaszoltam eddig, mert részben tanulmányoztam a küldött linkeket, részben (a hosszú hétvége miatt) leálltam a tanulmányozással. Amennyiben tudsz még segíteni, úgy további segítségedre szorulok (egyébként úgy érzem, hogy jó irányba haladunk).
    Írtam a kísérletezéshez egy próba programot. Egy részlete:

    procedure TPipeServerForm.BitBtn2Click(Sender: TObject);
    Var securityDescriptorPtr: PSecurityDescriptor;

    E: Integer;
    SACL: AnsiString;
    P: PAnsiChar;
    S: String;
    begin
    GetMem(securityDescriptorPtr, 1000);
    fillchar(securityDescriptorPtr^, SECURITY_DESCRIPTOR_MIN_LENGTH, 0);

    if InitializeSecurityDescriptor(securityDescriptorPtr, SECURITY_DESCRIPTOR_REVISION) then
    begin
    SACL := 'D:(A;;0x12019b;;;WD)';
    if ConvertStringSecurityDescriptorToSecurityDescriptorA(
    Pointer(SACL), SDDL_REVISION_1, securityDescriptorPtr, nil) then
    Begin
    If ConvertSecurityDescriptorToStringSecurityDescriptorA(securityDescriptorPtr,
    SDDL_REVISION_1,
    OWNER_SECURITY_INFORMATION or
    GROUP_SECURITY_INFORMATION or
    DACL_SECURITY_INFORMATION or
    SACL_SECURITY_INFORMATION,
    P, Nil) then
    Begin
    S := P;
    WriteLog(S);
    End
    else
    Begin
    E := GetLastError;
    WriteLog('ConvertSecurityDescriptorToStringSecurityDescriptorA! Errorcode=' + IntToStr(E));
    End;
    LocalFree(DWORD(P));
    End
    else
    Begin
    E := GetLastError;
    WriteLog('ConvertStringSecurityDescriptorToSecurityDescriptorA! Errorcode=' + IntToStr(E));
    End;

    end
    else
    Begin
    E := GetLastError;
    WriteLog('InitializeSecurityDescriptor! Errorcode=' + IntToStr(E));
    End;
    end;


    Ha futtatom, akkor azt tapasztalom, hogy a string-ből konvertálás (ConvertStringSecurityDescriptorToSecurityDescriptorA) hiba nélkül lefut, amikor viszont vissza akarom konvertálni (ConvertSecurityDescriptorToStringSecurityDescriptorA), akkor 1305 hibajelzést kapok (ERROR_UNKNOWN_REVISION). A két függvényhívásban a SDDL_REVISION_1 értéke egyformán 1.
    Ha a Security descriptort nem így hozom létre, hanem ahogyan az egyik példában láttam (üres leíró), akkor a visszakonvertálás is működik, eredménye "D:". A program:
    procedure TPipeServerForm.BitBtn3Click(Sender: TObject);
    Var
    securityDescriptorPtr1: PSecurityDescriptor;
    E: Integer;
    P: PAnsiChar;
    S: String;

    begin
    GetMem(securityDescriptorPtr1, 1000);
    fillchar(securityDescriptorPtr1^, SECURITY_DESCRIPTOR_MIN_LENGTH, 0);
    InitializeSecurityDescriptor(securityDescriptorPtr1, SECURITY_DESCRIPTOR_REVISION);
    if SetSecurityDescriptorDacl(securityDescriptorPtr1, true, nil, false) then
    Begin
    If ConvertSecurityDescriptorToStringSecurityDescriptorA(securityDescriptorPtr1,
    SDDL_REVISION_1,
    OWNER_SECURITY_INFORMATION or
    GROUP_SECURITY_INFORMATION or
    DACL_SECURITY_INFORMATION or
    SACL_SECURITY_INFORMATION,
    P, Nil) then
    Begin
    S := P;
    WriteLog(S);
    End
    else
    Begin
    E := GetLastError;
    WriteLog('ConvertSecurityDescriptorToStringSecurityDescriptorA! Errorcode=' + IntToStr(E));
    End;
    LocalFree(DWORD(P));
    End
    else
    Begin
    E := GetLastError;
    WriteLog('SetSecurityDescriptorDacl! Errorcode=' + IntToStr(E));
    End;
    end;


    Ebből arra következtetek, hogy a hiba nem az SDDL_REVISION_1 értékében van.

    Ha pipe-ot szeretnék létrehozni a fenti módok valamelyikén létrehozott DACL-lal, akkor azt tapasztalom, hogy a CreateNamedPipe függvény INVALID_HANDLE_VALUE értékkel tér vissza, viszont amikor lekérdezem a hibakódot, akkor 0-t kapok:

    Pipe := CreateNamedPipe('\.\pipe\TestPipeServer', PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 4096, 4096, NMPWAIT_USE_DEFAULT_WAIT, @SA);

    if Pipe = INVALID_HANDLE_VALUE then
    Begin

    E := GetLastError;
    WriteLog('Pipe is not created! Errorcode=' + IntToStr(E));
    End
    else
    Begin

    Result := True;
    End;


    Kérdésem ezek után az, hogy tudsz-e segíteni a problémák megoldásában:
    1. A string-ből konvertált leíró visszakonvertálása miért nem sikerül?
    2. Milyen string-et adjak meg ahhoz (server), hogy a pipe létrejöjjön (ez a kód később egy szerviz része lesz).
    3. Milyen string-et adjak meg a túloldalon (cliens), hogy a kapcsolatot fel tudjam venni. Továbbra is Windows 7 alatt érdekel a megoldás.
    Mutasd a teljes hozzászólást!
  • Használhatnád a
    forráskód
    gombot. Ennek hiányában
    post
    -od sajnos olyan, mint az okádék. Nem is volt kedvem elolvasni...

    olvastam, hogy egy szervizzel való kommunikálás egyik legjobb módja a pipe


    Igen az egyik legjobb választás lehet, ha egy zárt hálózaton több
    Windows
    -os gép is kommunikálni akarna a szervízzel. Egy gépen belüli információcserére létezhet egyszerűbb megoldás is: pl.
    SendMessage
    (ld.
    WM_COPYDATA
    ). Ehhez példaként szolgálhat a
    FreePascal simpleipc
    csomagja.

    Amúgy meg egy
    multithread pipe server
    valóban sokkal elegánsabb. Viszont sokmindentől függhet, hogyan kell beállítani... Ha a szervízt más felhasználóként futtatod, mint amelyikkel megszólítod (netán másik gépről), akkor megszemélyesítés-re is szükség lehet. (Így találtam...)

    Személy szerint a kliensen pedig a
    CreateFile
    api függvény
    dwFlagsAndAttributes
    paraméterét
    SECURITY_SQOS_PRESENT or SECURITY_IDENTIFICATION
    -re állítom. Amennyiben a szerver a helyi gépen van, akkor még a
    SECURITY_DELEGATION
    -t is hozzáfűzöm. Megfelelően megy még
    Windows 2008 szerver
    -en is.
    Mutasd a teljes hozzászólást!
  • A külalakra vonatkozó kritikát "vettem". Ami a többit illeti:
    - a WM_COPYDATA megoldást előszeretettel használom a programjaim közötti kommunikációra, de ha az egyikük szerviz, úgy még nem sikerült megoldani, mert nincs "ablak", aki az üzenetet megkapná.
    - ugyanazon a gépen fut a szerviz is és a kliens program is. A szerviz természetesen más felhasználó alatt (SYSTEM).
    - a javaslataidat ki fogom próbálni.
    Köszönöm.
    Mutasd a teljes hozzászólást!
  • Megtaláltam a megoldást. Készítettem olyan Security Attribute-t, amellyel a pipe már elfogadja bárki kapcsolatfelvevési kísérletét.
    A közölt példa sok "felesleget" is tartalmaz, azonban ezek hasznosak lehetnek (konstansok, stb.), ha valakinek ettől kissé eltérőbb Attribute-re lenne szüksége:

    unit AclUnit; interface Uses Windows; Var SECURITYATTRIBUTES: SECURITY_ATTRIBUTES; implementation Uses SysUtils, ACLAPI, AccCtrl; Const SECURITY_MAX_SID_SIZE = 68; SECURITY_WORLD_RID = $00000000; SECURITY_BUILTIN_DOMAIN_RID = $00000020; DOMAIN_ALIAS_RID_ADMINS = $00000220; MAXIMUM_ALLOWED = $2000000; DELETE = $10000; READ_CONTROL = $20000; WRITE_DAC = $40000; WRITE_OWNER = $80000; SYNCHRONIZE = $100000; STANDARD_RIGHTS_READ = READ_CONTROL; STANDARD_RIGHTS_WRITE = READ_CONTROL; STANDARD_RIGHTS_EXECUTE = READ_CONTROL; STANDARD_RIGHTS_REQUIRED = $F0000; FILE_READ_DATA = $1; // ' file & pipe FILE_LIST_DIRECTORY = $1; // ' directory FILE_ADD_FILE = $2; // ' directory FILE_WRITE_DATA = $2; // ' file & pipe FILE_CREATE_PIPE_INSTANCE = $4; // ' named pipe FILE_ADD_SUBDIRECTORY = $4; // ' directory FILE_APPEND_DATA = $4; // ' file FILE_READ_EA = $8; // ' file & directory FILE_READ_PROPERTIES = FILE_READ_EA; // FILE_WRITE_EA = $10; // ' file & directory FILE_WRITE_PROPERTIES = FILE_WRITE_EA; // FILE_EXECUTE = $20; // ' file FILE_TRAVERSE = $20; // ' directory FILE_DELETE_CHILD = $40; // ' directory FILE_READ_ATTRIBUTES = $80; // ' all FILE_WRITE_ATTRIBUTES = $100; // ' all FILE_GENERIC_READ = (STANDARD_RIGHTS_READ Or FILE_READ_DATA Or FILE_READ_ATTRIBUTES Or FILE_READ_EA Or SYNCHRONIZE); FILE_GENERIC_WRITE = (STANDARD_RIGHTS_WRITE Or FILE_WRITE_DATA Or FILE_WRITE_ATTRIBUTES Or FILE_WRITE_EA Or FILE_APPEND_DATA Or SYNCHRONIZE); FILE_GENERIC_EXECUTE = (STANDARD_RIGHTS_EXECUTE Or FILE_READ_ATTRIBUTES Or FILE_EXECUTE Or SYNCHRONIZE); FILE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or $01FF); GENERIC_READ = $80000000; GENERIC_WRITE = $40000000; GENERIC_EXECUTE = $20000000; GENERIC_ALL = $10000000; Type WELL_KNOWN_SID_TYPE = ( WinNullSid = 0, WinWorldSid = 1, WinLocalSid = 2, WinCreatorOwnerSid = 3, WinCreatorGroupSid = 4, WinCreatorOwnerServerSid = 5, WinCreatorGroupServerSid = 6, WinNtAuthoritySid = 7, WinDialupSid = 8, WinNetworkSid = 9, WinBatchSid = 10, WinInteractiveSid = 11, WinServiceSid = 12, WinAnonymousSid = 13, WinProxySid = 14, WinEnterpriseControllersSid = 15, WinSelfSid = 16, WinAuthenticatedUserSid = 17, WinRestrictedCodeSid = 18, WinTerminalServerSid = 19, WinRemoteLogonIdSid = 20, WinLogonIdsSid = 21, WinLocalSystemSid = 22, WinLocalServiceSid = 23, WinNetworkServiceSid = 24, WinBuiltinDomainSid = 25, WinBuiltinAdministratorsSid = 26, WinBuiltinUsersSid = 27, WinBuiltinGuestsSid = 28, WinBuiltinPowerUsersSid = 29, WinBuiltinAccountOperatorsSid = 30, WinBuiltinSystemOperatorsSid = 31, WinBuiltinPrintOperatorsSid = 32, WinBuiltinBackupOperatorsSid = 33, WinBuiltinReplicatorSid = 34, WinBuiltinPreWindows2000CompatibleAccessSid = 35, WinBuiltinRemoteDesktopUsersSid = 36, WinBuiltinNetworkConfigurationOperatorsSid = 37, WinAccountAdministratorSid = 38, WinAccountGuestSid = 39, WinAccountKrbtgtSid = 40, WinAccountDomainAdminsSid = 41, WinAccountDomainUsersSid = 42, WinAccountDomainGuestsSid = 43, WinAccountComputersSid = 44, WinAccountControllersSid = 45, WinAccountCertAdminsSid = 46, WinAccountSchemaAdminsSid = 47, WinAccountEnterpriseAdminsSid = 48, WinAccountPolicyAdminsSid = 49, WinAccountRasAndIasServersSid = 50, WinNTLMAuthenticationSid = 51, WinDigestAuthenticationSid = 52, WinSChannelAuthenticationSid = 53, WinThisOrganizationSid = 54, WinOtherOrganizationSid = 55, WinBuiltinIncomingForestTrustBuildersSid = 56, WinBuiltinPerfMonitoringUsersSid = 57, WinBuiltinPerfLoggingUsersSid = 58, WinBuiltinAuthorizationAccessSid = 59, WinBuiltinTerminalServerLicenseServersSid = 60, WinBuiltinDCOMUsersSid = 61, WinBuiltinIUsersSid = 62, WinIUserSid = 63, WinBuiltinCryptoOperatorsSid = 64, WinUntrustedLabelSid = 65, WinLowLabelSid = 66, WinMediumLabelSid = 67, WinHighLabelSid = 68, WinSystemLabelSid = 69, WinWriteRestrictedCodeSid = 70, WinCreatorOwnerRightsSid = 71, WinCacheablePrincipalsGroupSid = 72, WinNonCacheablePrincipalsGroupSid = 73, WinEnterpriseReadonlyControllersSid = 74, WinAccountReadonlyControllersSid = 75, WinBuiltinEventLogReadersGroup = 76, WinNewEnterpriseReadonlyControllersSid = 77, WinBuiltinCertSvcDComAccessGroup = 78, WinMediumPlusLabelSid = 79, WinLocalLogonSid = 80, WinConsoleLogonSid = 81, WinThisOrganizationCertificateSid = 82, WinApplicationPackageAuthoritySid = 83, WinBuiltinAnyPackageSid = 84, WinCapabilityInternetClientSid = 85, WinCapabilityInternetClientServerSid = 86, WinCapabilityPrivateNetworkClientServerSid = 87, WinCapabilityPicturesLibrarySid = 88, WinCapabilityVideosLibrarySid = 89, WinCapabilityMusicLibrarySid = 90, WinCapabilityDocumentsLibrarySid = 91, WinCapabilitySharedUserCertificatesSid = 92, WinCapabilityDefaultWindowsCredentialsSid = 93, WinCapabilityRemovableStorageSid = 94 ); Const SECURITY_WORLD_SID_AUTHORITY : TSIDIdentifierAuthority = (Value:(0,0,0,0,0,1)); SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); Var pEveryoneSID: PSID; ACL: PACL; pSD: PSECURITY_DESCRIPTOR; procedure WriteLog(S: String); Var FN: String; F: TextFile; Begin FN := ChangeFileExt(ParamStr(0), '.LOG'); AssignFile(F, FN); if FileExists(FN) then Append(F) else Rewrite(F); WriteLn(F, FormatDateTime('yyyy/mm/dd hh:nn:ss.zzz ', Now), S); CloseFile(F); End; procedure Init; Var SIDAuthWorld: TSIDIdentifierAuthority; EA: EXPLICIT_ACCESS_A; E: Integer; dwRes: DWORD; Begin SIDAuthWorld:= SECURITY_WORLD_SID_AUTHORITY; if not AllocateAndInitializeSid(SIDAuthWorld, 1,
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd