DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: szliyu112358
今日帖子: 49
在线用户: 12
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2020/2/12 21:54:59
标题:
注册表读取权限问题 浏览:1676
加入我的收藏
楼主: 都说win7以后,使用delphi7就不能操作注册表了,我发现了一个奇怪的现象,求指教

测试函数,读取电脑串口列表
uses Registry;

function GetComPorts:TStringList;
var
  reg: TRegistry;
  ts: TStrings;
  i: integer;
begin
  Result:=TStringList.Create;
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;//Windows
  reg.OpenKey('HARDWARE\DEVICEMAP\SERIALCOMM', true);
  ts := TStringList.Create;
  reg.GetValueNames(ts);
  for i := 0 to ts.Count - 1 do
  begin
    Result.Add(reg.ReadString(ts.Strings[i]));
  end;
  ts.Free;
  reg.CloseKey;
  reg.Free;
end;
我在一台系统为win10 64位 教育版的电脑上运行测试函数,
1、直接运行程序,则串口列表无法读取
2、右键“以管理员身份运行”,串口列表能读取
在一台系统为Win10 64位 企业版 LTSC的电脑上运行测试函数,
1、直接运行程序,串口列表能读取

所以就奇怪了,到底是什么原因,导致的这个问题
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2020/2/12 22:24:24
1楼: TRegistry.Create()  有参数的, 指定64位.
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2020/2/12 22:36:57
2楼: 我测试用的是delphi7
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2020/2/13 1:51:04
3楼: 1、和 Dn 无关,UAC 提权问题:访问 HKEY_LOCAL_MACHINE 还 OpenKey + true 参数
2、LTSC 系统上,UAC 被关了?
----------------------------------------------
-
作者:
男 a5824 (Return) ★☆☆☆☆ -
普通会员
2020/2/13 9:06:34
4楼: 看你的账户是不是admin登录的
----------------------------------------------
-
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2020/2/13 9:28:30
5楼: win7以上是要权限的, 你要操作的是HKEY_LOCAL_MACHINE
TRegistry.Create默认权限是KEY_ALL_ACCESS, 包括了读和写
而windows对用户默认是不开放写权限的, 所以你用默认权限操作注册表的HKEY_LOCAL_MACHINE就会失败

如果你只是想读取串口, 在create时制定只需要读权限就可以了: TRegistry.Create(KEY_READ)
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2020/2/13 11:37:19
6楼: 仅仅读取的话,OpenKey 就不要用 True参数了吧,False 就可以啊
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2020/2/13 15:34:07
7楼: @hs_kill (lzl_17948876),的确,reg := TRegistry.Create(KEY_READ);这样就可以读取了,多问一句,要是需要写的权限,要怎么做呢?
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 xlonger (xlonger) ★☆☆☆☆ -
普通会员
2020/2/13 16:03:46
8楼: 语法是死的。看 help不就可以吗?


TRegistry (Delphi)From RAD Studio Code Examples
Language:Delphi
DescriptionThis example shows how to use the TRegistry class in order to find, insert, and delete Keys and Items into the Windows Registry. This example uses two buttons-- InsertToRegBtn and DeleteFromRegBtn on a form, for inserting and deleting the values. 

Code
procedure TForm3.InsertToRegBtnClick(Sender: TObject);
var
  reg        : TRegistry;
  openResult : Boolean;
  today      : TDateTime;
begin
  reg := TRegistry.Create(KEY_READ);
  reg.RootKey := HKEY_LOCAL_MACHINE;
 
  if (not reg.KeyExists('Software\MyCompanyName\MyApplication\')) then
    begin
      MessageDlg('Key not found! Created now.',
                  mtInformation, mbOKCancel, 0);
    end;
  reg.Access := KEY_WRITE;
  openResult := reg.OpenKey('Software\MyCompanyName\MyApplication\',True);
 
  if not openResult = True then
    begin
      MessageDlg('Unable to create key! Exiting.',
          mtError, mbOKCancel, 0);
      Exit();
    end;
 
  { Checking if the values exist and inserting when neccesary }
 
  if not reg.KeyExists('Creation\ Date') then
    begin
      today := Now;
      reg.WriteDateTime('Creation\ Date', today);
    end;
 
  if not reg.KeyExists('Licenced\ To') then
    begin
      reg.WriteString('Licenced\ To', 'MySurname\ MyFirstName');
    end;
 
  if not reg.KeyExists('App\ Location') then
    begin
      reg.WriteExpandString('App\ Location',
          '%PROGRAMFILES%\MyCompanyName\MyApplication\');
    end;
 
  if not reg.KeyExists('Projects\ Location') then
    begin
      reg.WriteExpandString('Projects\ Location',
          '%USERPROFILE%\MyApplication\Projects\');
    end;
 
  reg.CloseKey();
  reg.Free;
 
end;
 
procedure TForm3.DeleteFromRegBtnClick(Sender: TObject);
var
  reg : TRegistry;
begin
  reg := TRegistry.Create(KEY_WRITE);
  reg.RootKey := HKEY_LOCAL_MACHINE;
 
  reg.DeleteKey('Software\MyCompanyName\MyApplication');
  reg.DeleteKey('Software\MyCompanyName');
 
  reg.CloseKey();
  reg.Free;
 
end;UsesSystem.Win.Registry.TRegistry 
System.Win.Registry.TRegistry.Create 
System.Win.Registry.TRegistry.KeyExists 
System.Win.Registry.TRegistry.OpenKey 
System.Win.Registry.TRegistry.WriteDateTime 
System.Win.Registry.TRegistry.WriteString 
System.Win.Registry.TRegistry.WriteExpandString 
System.Win.Registry.TRegistry.CloseKey 
System.Win.Registry.TRegistry.DeleteKey 
System.Win.Registry.TRegistry.RootKey 
System.Win.Registry.TRegistry.Access 
Categories: Delphi2010Help Feedback Copyright (C) 2016 Embarcadero Technologies, Inc. All Rights Reserved. Current Wiki Page
----------------------------------------------
我打的是酱油,而不是别的什么油。
我灌的是口水,而不是别的什么水。
我聊的折腾不是那个不折腾的折腾。
我说的阿娇不是那个邓玉娇的阿娇。
3个代表,6个为什么,9个肠胃炎。
D性强的领导干部都不喜欢热比娅。
我特别要讲的是,屁民网黄色论坛是我经常上网必选的 网站之一
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2020/2/15 14:22:09
9楼: @ken0137 (顺眼即佛)
写权限当然就需要有管理员权限了

管理员权限最常见的就是用管理员权限运行程序
或者系统服务(Service)也有权限
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 zhouying (zy) ★☆☆☆☆ -
盒子活跃会员
2020/2/16 22:11:47
10楼: @hs_kill大佬,是否可以让bat文件直接在管理员权限下执行而不弹出那个UAC的窗口?
----------------------------------------------
-
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2020/2/17 18:01:21
11楼: 呵呵呵....微软花了那么多年才吧windows的权限机制弄的比较不错了
你现在却苦心积虑的要绕过他.......

以正常的手段来说, 无论你怎么启动, 最早的一个程序一定要用管理员权限运行

举几个栗子:

先是直接运行, 直接管理员权限运行程序

后面的都是依赖权限继承间接运行
1.以管理员权限运行一个程序, 这个程序执行你的程序
2.以管理员权限安装一个服务, 服务调用你的程序(不能有界面)
3.以管理员权限注册一个计划任务, 计划任务调用你的程序

如果你再想折腾, 比如先运行一个程序, 程序执行一个批处理, 批处理执行你的程序

无论如何, 第一个程序需要用管理员权限运行, 以后, 由这个程序启动的其他进程才能继承管理员权限
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.125毫秒 RSS