{"id":638,"date":"2008-05-17T22:07:05","date_gmt":"2008-05-17T22:07:05","guid":{"rendered":"http:\/\/6teen.ru\/?p=614"},"modified":"2008-05-17T22:07:05","modified_gmt":"2008-05-17T22:07:05","slug":"6499","status":"publish","type":"post","link":"http:\/\/pblog.ru\/lab\/?p=638","title":{"rendered":"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u043f\u0430\u0440\u043e\u043b\u0438, \u0437\u0430\u0449\u0438\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (DELPHI\/windows)"},"content":{"rendered":"<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u043f\u0430\u0440\u043e\u043b\u0438, \u0437\u0430\u0449\u0438\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (DELPHI\/windows)<br \/>\n<!--more--><\/p>\n<pre class=\"alt2\" style=\"margin:0px; padding:6px; border:1px inset; width:580px; height:320px; overflow:auto\"><div>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u043f\u0430\u0440\u043e\u043b\u0438, \u0437\u0430\u0449\u0438\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (DELPHI\/windows)\n\n\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439\n{\nfor some functions you need to get the right privileges\non a windows nt machine.\n(e.g: to shut down or restart windows with exitwindowsex or\nto change the system time)\nthe following code provides a procedure to adjust the privileges.\nthe adjusttokenprivileges() function enables or disables privileges\nin the specified access token.\n}\n\n\/\/ nt defined privileges from winnt.h\n\nconst\nse_create_token_name = 'secreatetokenprivilege';\nse_assignprimarytoken_name = 'seassignprimarytokenprivilege';\nse_lock_memory_name = 'selockmemoryprivilege';\nse_increase_quota_name = 'seincreasequotaprivilege';\nse_unsolicited_input_name = 'seunsolicitedinputprivilege';\nse_machine_account_name = 'semachineaccountprivilege';\nse_tcb_name = 'setcbprivilege';\nse_security_name = 'sesecurityprivilege';\nse_take_ownership_name = 'setakeownershipprivilege';\nse_load_driver_name = 'seloaddriverprivilege';\nse_system_profile_name = 'sesystemprofileprivilege';\nse_systemtime_name = 'sesystemtimeprivilege';\nse_prof_single_process_name = 'seprofilesingleprocessprivilege';\nse_inc_base_priority_name = 'seincreasebasepriorityprivilege';\nse_create_pagefile_name = 'secreatepagefileprivilege';\nse_create_permanent_name = 'secreatepermanentprivilege';\nse_backup_name = 'sebackupprivilege';\nse_restore_name = 'serestoreprivilege';\nse_shutdown_name = 'seshutdownprivilege';\nse_debug_name = 'sedebugprivilege';\nse_audit_name = 'seauditprivilege';\nse_system_environment_name = 'sesystemenvironmentprivilege';\nse_change_notify_name = 'sechangenotifyprivilege';\nse_remote_shutdown_name = 'seremoteshutdownprivilege';\nse_undock_name = 'seundockprivilege';\nse_sync_agent_name = 'sesyncagentprivilege';\nse_enable_delegation_name = 'seenabledelegationprivilege';\nse_manage_volume_name = 'semanagevolumeprivilege';\n\n\/\/ enables or disables privileges debending on the benabled\n\/\/ aktiviert oder deaktiviert privilegien, abhangig von benabled\n\nfunction ntsetprivilege(sprivilege: string; benabled: boolean): boolean;\nvar\nhtoken: thandle;\ntokenpriv: token_privileges;\nprevtokenpriv: token_privileges;\nreturnlength: cardinal;\nbegin\nresult := true;\n\/\/ only for windows nt\/2000\/xp and later.\nif not (win32platform = ver_platform_win32_nt) then exit;\nresult := false;\n\n\/\/ obtain the processes token\nif openprocesstoken(getcurrentprocess(),\ntoken_adjust_privileges or token_query, htoken) then\nbegin\ntry\n\/\/ get the locally unique identifier (luid) .\nif lookupprivilegevalue(nil, pchar(sprivilege),\ntokenpriv.privileges[0].luid) then\nbegin\ntokenpriv.privilegecount := 1; \/\/ one privilege to set\n\ncase benabled of\ntrue: tokenpriv.privileges[0].attributes := se_privilege_enabled;\nfalse: tokenpriv.privileges[0].attributes := 0;\nend;\n\nreturnlength := 0; \/\/ replaces a var parameter\nprevtokenpriv := tokenpriv;\n\n\/\/ enable or disable the privilege\n\nadjusttokenprivileges(htoken, false, tokenpriv, sizeof(prevtokenpriv),\nprevtokenpriv, returnlength);\nend;\nfinally\nclosehandle(htoken);\nend;\nend;\n\/\/ test the return value of adjusttokenprivileges.\nresult := getlasterror = error_success;\nif not result then\nraise exception.create(syserrormessage(getlasterror));\nend;\n\u0412\u0437\u044f\u0442\u043e \u0441 \u0441\u0430\u0439\u0442\u0430 http:\/\/www.swissdelphicenter.ch\/en\/tipsindex.php\n\n===============================================\n\u041a\u0430\u043a \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0438\u0432\u0435\u043b\u0435\u0433\u0438\u0439?\n\nprocedure tform1.button1click(sender: tobject);\nconst\ntokensize = 800; \/\/ (sizeof(pointer)=4 *200)\nvar\nhtoken: thandle;\nptokeninfo: ptokenprivileges;\nreturnlen: cardinal;\ni: integer;\nprivname: pchar;\ndisplayname: pchar;\nnamesize: cardinal;\ndisplsize: cardinal;\nlangid: cardinal;\nbegin\ngetmem(ptokeninfo, tokensize);\nif not openprocesstoken(getcurrentprocess(), token_adjust_privileges or token_query,\nhtoken) then showmessage('openprocesstoken error');\nif not gettokeninformation(htoken, tokenprivileges, ptokeninfo, tokensize, returnlen) then\nshowmessage('gettokeninformation error');\ngetmem(privname, 255);\ngetmem(displayname, 255);\nfor i := 0 to ptokeninfo.privilegecount - 1 do\nbegin\ndisplsize := 255;\nnamesize := 255;\nlookupprivilegename(nil, ptokeninfo.privileges[i].luid, privname, namesize);\nlookupprivilegedisplayname(nil, privname, displayname, displsize, langid);\nlistbox1.items.add(privname +^i + displayname);\nend;\nfreemem(privname);\nfreemem(displayname);\nfreemem(ptokeninfo);\nend;\n\u0412\u0437\u044f\u0442\u043e \u0441 \u0441\u0430\u0439\u0442\u0430 http:\/\/www.swissdelphicenter.ch\/en\/tipsindex.php\n\n====================================================================\n\u041a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0438\u043c\u0435\u0435\u043c \u043b\u0438 \u043c\u044b \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435?\ntype\nptoken_groups = token_groups^;\n\nfunction runningasadministrator(): boolean;\nvar\nsystemsidauthority: sid_identifier_authority = security_nt_authority;\npsidadmin: psid;\nptg: ptoken_groups = nil;\nhtkthread: integer; { handle }\ncbtokengroups: longint; { dword }\nigroup: longint; { dword }\nbadmin: boolean;\nbegin\nresult := false;\nif not openthreadtoken(getcurrentthread(), \/\/ get security token\ntoken_query, false, htkthread) then\nif getlasterror() = error_no_token then\nbegin\nif not openprocesstoken(getcurrentprocess(),\ntoken_query, htkthread) then\nexit;\nend\nelse\nexit;\n\nif gettokeninformation(htkthread, \/\/ get #of groups\ntokengroups, nil, 0, cbtokengroups) then\nexit;\n\nif getlasterror() <> error_insufficient_buffer then\nexit;\n\nptg := ptoken_groups(getmem(cbtokengroups));\nif not assigned(ptg) then\nexit;\n\nif not gettokeninformation(htkthread, \/\/ get groups\ntokengroups, ptg, cbtokengroups, cbtokengroups) then\nexit;\n\nif not allocateandinitializesid(systemsidauthority,\n2, security_builtin_domain_rid, domain_alias_rid_admins,\n0, 0, 0, 0, 0, 0, psidadmin) then\nexit;\n\nigroup := 0;\nwhile igroup < ptg^.groupcount do \/\/ check administrator group\nbegin\nif equalsid(ptg^.groups[igroup].sid, psidadmin) then\nbegin\nresult := true;\nbreak;\nend;\ninc(igroup);\nend;\nfreesid(psidadmin);\nend;\n\n\u0412\u0437\u044f\u0442\u043e \u0441http:\/\/delphiworld.narod.ru\n=======================================================\n\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0442 system account?\nfunction onsystemaccount(): boolean;\nconst\ncnmaxnamelen = 254;\nvar\nsname: string;\ndwnamelen: dword;\nbegin\ndwnamelen := cnmaxnamelen - 1;\nsetlength(sname, cnmaxnamelen);\ngetusername(pchar(sname), dwnamelen);\nsetlength(sname, dwnamelen);\nif uppercase(trim(sname)) = 'system' then result := true\nelse\nresult := false;\nend;\n\u0412\u0437\u044f\u0442\u043e \u0441 \u0441\u0430\u0439\u0442\u0430 http:\/\/www.swissdelphicenter.ch\/en\/tipsindex.php\n===============================================================\n\u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\nuses\njwawinbase; ( http:\/\/members.chello.nl\/m.vanbrakel2\/ )\n\n\/\/...\n\nprocedure tform1.button1click(sender: tobject);\nvar\nsi: startupinfow;\npif: process_information;\nres: bool;\ns: string;\nbegin\n\/\/set startupinfow first\nsi.cb := sizeof(startupinfow);\nsi.dwflags := startf_useshowwindow;\nsi.wshowwindow := sw_showdefault;\nsi.lpreserved := nil;\nsi.lpdesktop := nil;\nsi.lptitle := 'konsole';\n\/\/ run createprocesswithlogonw...\nres := createprocesswithlogonw('security', 'arvicor', 'test', logon_with_profile,\n'c:\\win2kas\\system32\\regedt32.exe', nil\n, create_default_error_mode, nil, nil, si, pif);\nif booltostr(res) = '0' then\nbegin\n\n\/\/if an error occures, show the error-code\n\/\/this code can be 'translated' with 'net helpmsg ' on command-prompt\nstr(getlasterror, s);\nshowmessage('createprocesswithlogonresult: ' + booltostr(res) + #10 +\n'getlasterror: ' + s);\nend;\nend;\n\n\u0412\u0437\u044f\u0442\u043e \u0441 \u0441\u0430\u0439\u0442\u0430 http:\/\/www.swissdelphicenter.ch\/en\/tipsindex.php\n================================================\n\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n\ngetlocaluserlist - \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (windows nt, windows 2000)\n\nunit func;\n\ninterface\n\nuses sysutils, classes, stdctrls, comctrls, graphics, windows;\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n{$externalsym netuserenum}\nfunction netuserenum(servername: lpwstr;\n\nlevel,\nfilter: dword;\nbufptr: pointer;\nprefmaxlen: dword;\nentriesread,\ntotalentries,\nresume_handle: lpdword): dword; stdcall;\nexternal 'netapi32.dll' name 'netuserenum';\n\nfunction netapibufferfree(buffer: pointer {lpvoid}): dword; stdcall;\n\nexternal 'netapi32.dll' name 'netapibufferfree';\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\nprocedure getlocaluserlist(ulist: tstringlist);\n\nimplementation\n\n\/\/------------------------------------------------------------------------------\n\/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430\n\/\/------------------------------------------------------------------------------\n\nprocedure getlocaluserlist(ulist: tstringlist);\nconst\n\nnerr_success = 0;\nfilter_temp_duplicate_account = $0001;\nfilter_normal_account = $0002;\nfilter_proxy_account = $0004;\nfilter_interdomain_trust_account = $0008;\nfilter_workstation_trust_account = $0010;\nfilter_server_trust_account = $0020;\n\ntype\n\ntuser_info_10 = record\nusri10_name,\nusri10_comment,\nusri10_usr_comment,\nusri10_full_name: pwidechar;\nend;\npuser_info_10 = ^tuser_info_10;\n\nvar\n\ndweread, dwetotal, dwres, res: dword;\ninf: puser_info_10;\ninfo: pointer;\np: pchar;\ni: integer;\nbegin\n\nif ulist = nil then\nexit;\nulist.clear;\n\ninfo := nil;\ndwres := 0;\nres := netuserenum(nil,\n10,\nfilter_normal_account,\n@info,\n65536,\n@dweread,\n@dwetotal,\n@dwres);\nif (res <> nerr_success) or (info = nil) then\nexit;\np := pchar(info);\nfor i := 0 to dweread - 1 do\nbegin\ninf := puser_info_10(p + i * sizeof(tuser_info_10));\nulist.add(widechartostring(pwidechar((inf^).usri10_name)));\nend;\n\nnetapibufferfree(info);\nend;\n\nend.\n\n\u0410\u0432\u0442\u043e\u0440: \u041a\u043e\u043d\u0434\u0440\u0430\u0442\u044e\u043a \u0412\u0438\u0442\u0430\u043b\u0438\u0439\n\n\u0412\u0437\u044f\u0442\u043e \u0441 http:\/\/delphiworld.narod.ru\n==============================================\n\u041a\u0430\u043a \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c, \u0441\u043a\u0440\u044b\u0442\u044b\u0439 \u0437\u0430 \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u0430\u043c\u0438?\n\u041d\u0430\u0432\u0435\u0440\u043d\u043e \u0442\u0430\u043a: \u0445\u043e\u0442\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435\n\nprocedure tform1.timer1timer(sender: tobject);\nvar\nwnd : hwnd;\n\nlpclassname: array [0..$ff] of char;\n\n\nbegin\nwnd := windowfrompoint(mouse.cursorpos);\n\ngetclassname (wnd, lpclassname, $ff);\n\nif ((strpas(lpclassname) = 'tedit') or (strpas(lpclassname) = 'edit')) then\n\npostmessage (wnd, em_setpasswordchar, 0, 0);\n\n\nend;\n\n\u0410\u0432\u0442\u043e\u0440 \u043e\u0442\u0432\u0435\u0442\u0430: baa\n\u0412\u0437\u044f\u0442\u043e \u0441 vingrad.ru http:\/\/forum.vingrad.ru\n\n\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u0430, \u0442\u043e \u0435\u0451 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c passwordchar(\u043f\u0440\u0438\u043c\u0435\u0440: \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0432 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438)\n\n\u0410\u0432\u0442\u043e\u0440 \u043e\u0442\u0432\u0435\u0442\u0430: mikel\n\u0412\u0437\u044f\u0442\u043e \u0441 vingrad.ru http:\/\/forum.vingrad.ru\n<\/div><\/pre>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u043f\u0430\u0440\u043e\u043b\u0438, \u0437\u0430\u0449\u0438\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (DELPHI\/windows)<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[448,458],"tags":[1126,752,237,1539,1576],"_links":{"self":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/638"}],"collection":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=638"}],"version-history":[{"count":0,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=\/wp\/v2\/posts\/638\/revisions"}],"wp:attachment":[{"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/pblog.ru\/lab\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}