我的程序如何检测它是否在特定域上运行?

2023-12-10

我需要根据当前登录用户的位置限制应用程序的特定功能。由于我必须在 Delphi 中实现此逻辑,因此我不希望过度使用完整的 Active Directory/LDAP 查询。

我当前的想法是利用 DsGetDcName,并使用 DOMAIN_CONTROLLER_INFO 结构中返回的 GUID,并将其与硬编码常量进行比较。似乎有理由认为,只有重新创建域,域 GUID 才会更改,因此这将以有限的开销提供我想要的功能。我唯一担心的是我在 MSDN 上找不到任何文档来证实我的假设。

type
  EAccessDenied = Exception;
  EInvalidOwner = Exception;
  EInsufficientBuffer = Exception;
  ELibraryNotFound = Exception;

  NET_API_STATUS = Integer;

  TDomainControllerInfoA = record
    DomainControllerName: LPSTR;
    DomainControllerAddress: LPSTR;
    DomainControllerAddressType: ULONG;
    DomainGuid: TGUID;
    DomainName: LPSTR;
    DnsForestName: LPSTR;
    Flags: ULONG;
    DcSiteName: LPSTR;
    ClientSiteName: LPSTR;
  end;
  PDomainControllerInfoA = ^TDomainControllerInfoA;

const
  NERR_Success = 0;

procedure NetCheck(ErrCode: NET_API_STATUS);
begin
  if ErrCode <> NERR_Success then
  begin
    case ErrCode of
      ERROR_ACCESS_DENIED:
        raise EAccessDenied.Create('Access is Denied');
      ERROR_INVALID_OWNER:
        raise EInvalidOwner.Create('Cannot assign the owner of this object.');
      ERROR_INSUFFICIENT_BUFFER:
        raise EInsufficientBuffer.Create('Buffer passed was too small');
      else
        raise Exception.Create('Error Code: ' + IntToStr(ErrCode) + #13 +
          SysErrorMessage(ErrCode));
    end;
  end;
end;

function IsInternalDomain: Boolean;
var
  NTNetDsGetDcName: function(ComputerName, DomainName: PChar; DomainGuid: PGUID; SiteName: PChar; Flags: ULONG; var DomainControllerInfo: PDomainControllerInfoA): NET_API_STATUS; stdcall;
  NTNetApiBufferFree: function (lpBuffer: Pointer): NET_API_STATUS; stdcall;
  LibHandle: THandle;
  DomainControllerInfo: PDomainControllerInfoA;
  ErrMode: Word;
const
  NTlib = 'NETAPI32.DLL';
  DS_IS_FLAT_NAME = $00010000;
  DS_RETURN_DNS_NAME = $40000000;
  INTERNAL_DOMAIN_GUID: TGUID = '{????????-????-????-????-????????????}';
begin
 if Win32Platform = VER_PLATFORM_WIN32_NT then
    begin
    ErrMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
    LibHandle := LoadLibrary(NTlib);
    SetErrorMode(ErrMode);
    if LibHandle = 0 then
        raise ELibraryNotFound.Create('Unable to map library: ' + NTlib);
    try
      @NTNetDsGetDcName := GetProcAddress(Libhandle, 'DsGetDcNameA');
      @NTNetApiBufferFree       := GetProcAddress(Libhandle,'NetApiBufferFree');
      try
        NetCheck(NTNetDsGetDcName(nil, nil, nil, nil, DS_IS_FLAT_NAME or DS_RETURN_DNS_NAME, DomainControllerInfo));
        Result := (DomainControllerInfo.DomainName = 'foo.com') and (CompareMem(@DomainControllerInfo.DomainGuid,@INTERNAL_DOMAIN_GUID, SizeOf(TGuid)));//WideCharToString(pDomain);
      finally
        NetCheck(NTNetApiBufferFree(DomainControllerInfo));
      end;
    finally
      FreeLibrary(LibHandle);
    end;
    end
 else
  Result := False;
end;

添加了相关问题服务器故障正如建议的那样。

发现另一本有趣的读物Technet这似乎也暗示我是对的,但并没有专门针对域 SID。


在域上创建一个服务帐户;

获取服务帐户的 GUID 并对其进行加密并将其保存在某个位置(注册表),可能作为企业安装过程的一部分来验证许可协议。

客户端应用程序启动时查询域服务帐户 GUID 并使用保存的 GUID 进行验证。

或者创建您自己的企业“关键”服务器。

执行 LDAP 查询比执行所有域控制器的废话更容易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的程序如何检测它是否在特定域上运行? 的相关文章

  • 为什么我的 Delphi FindDialog 中的光标没有变成沙漏形?

    我只是用以下命令打开 FindDialog FindDialog Execute 在我的 FindDialog OnFind 事件中 我想将光标更改为沙漏以搜索大文件 这可能需要几秒钟 所以在 OnFind 事件中我这样做 Screen C
  • 如何检查 Windows 文件索引是否打开或关闭

    C 中是否有一个 API 可用于检查文件索引是否打开或关闭 代码受到赞赏 WMI 在 C 中是一个痛苦 但本机服务 API 非常干净 SC HANDLE hSCManager OpenSCManager NULL NULL SC MANAG
  • 当执行 Tomcat 的 proxy_pass 时,Nginx 如何添加子域作为参数

    我想要实现的目标Web 应用程序应该能够支持多个子域 而无需在每次使用新子域时对 nginx 或 tomcat 进行任何更改 我已经对 DNS 进行了必要的更改以支持通配符子域 Nginx 监听端口 80 它在端口 8080 上对 tomc
  • 是否可以确定哪个键盘发送了按键?

    我有一个 Windows Media Center 遥控器 Windows 将其识别为键盘 当我使用 Windows Media Center 运行多显示器设置并在一个屏幕上播放视频时 遥控器的输入将与常规键盘一起定向到活动窗口 因此 当我
  • Delphi 生成的 Dylib 在 OSX 上的可靠部署

    我想在 OSX 上部署一个 dylib 它是用 Delphi 创建的 这个 dylib 应该是可由第三方应用程序加载 这看起来像是一个重复的问题 但经过大量搜索后 我找不到答案 这和这个是同一个问题 https forums embarca
  • 从 C++ 启动 Windows 照片应用程序以获取文件列表

    我想从 C 启动 Windows 照片应用程序以获取图像文件列表 照片应用程序的问题在于 如果使用 ShellExecute 对于单个文件 启动它 它将禁用下一个和上一个按钮 即使该文件夹包含其他图像也是如此 我尝试使用 IApplicat
  • C++ win32 从资源加载字符串

    好吧 我最近决定将应用程序中的每个字符串放入 STRINGTABLE 中 这样我就可以轻松翻译成不同的语言 我知道如何使用 LoadString api 但这涉及我为要加载的每个字符串使用不同的变量 如果我的应用程序有 100 个字符串 那
  • Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?

    我正在编写一些通过 STDIN 与客户端进程通信的服务器代码 我正在尝试编写一段 Perl 代码 用于异步接收来自客户端 STDOUT 的响应 代码的阻塞版本可能如下所示 sub read from client my file handl
  • 在 DLL 中使用 IXMLDocument 需要 CoInitialize?

    有没有理由使用CoInitialize使用时在我的 DLL 函数中IXMLDocument msxml 包装器 或与此相关的其他 com 对象 调用应用程序 线程是否负责调用CoInitialize CoUninitialize 如果我使用
  • Delphi 使用 标记将 TXMLData 包装在 SOAP 请求中

    我使用 TXMLData 发送 XML Delphi 在请求中添加一个标签 我的代码如下 RequestData TXMLData Create RequestData LoadFromXML
  • 将滚动条隐藏在 Delphi dbgrid 中(即使在调整大小时)

    对于我们的 dbgrid 我们希望滚动条始终隐藏 由于 TDBGrid 没有 滚动条 属性 我们使用 ShowScrollBar DBGrid1 Handle SB VERT False ShowScrollBar DBGrid1 Hand
  • 如何更改按钮上的光标?

    static HWND btn HCURSOR cursor LoadCursor 0 IDC CROSS case WM CREATE btn CreateWindow TEXT BUTTON TEXT Press Me WS CHILD
  • 通过 GroupPrincipal 查找用户

    在我的 Active Directory my domain 中 我有许多组 UserGrp1 UserGrp2 等 其中有许多用户 一个用户可以存在于多个组中 我目前的代码允许我使用 GroupPrincipal 类来查找组 然后从那里获
  • 如何将 CreateThread 用于类成员函数?

    你如何使用CreateThread 创建作为类成员的函数的线程 您需要创建一个静态方法来用作实际的线程启动函数 并将一个指向实例的指针作为lpParameter论证CreateThread 这将被传递给静态方法 该方法可以将其转换为对象指针
  • Winapi:获取具有特定文件句柄的进程

    目前我有一个带有文件过滤器驱动程序的软件 在软件安装过程中 驱动程序以以下方式作为服务启动 CreateService serviceManager name displayName SERVICE START DELETE SERVICE
  • 如何将接口名称映射到不同的方法名称?

    如果我有一个实现接口的对象 默认情况下它会自动将接口方法映射到具有相同名称和签名的类方法上 有什么方法可以覆盖它并将接口方法映射到具有相同签名但名称不同的方法上 例如 如果我实现两个接口 这两个接口都有一个具有相同名称和签名的方法 并且我希
  • 为什么 PC 之间的控件缩放比例不同?

    我尝试通过隐藏一些元素为用户提供 干净简单 的界面 只有一个小箭头表示他可以展开主菜单栏的某些部分 当全部关闭时 它看起来像这样 当你全部打开时 它看起来像这样 每个箭头都是位于面板左侧的速度按钮 通过单击该按钮 宽度可以在 速度 按钮 关
  • 我们可以从 Delphi 调用 Native Windows API 吗?

    是否可以从 Delphi 应用程序中调用内核 Native API 喜欢nt and zw系统调用 您确实可以从 Delphi 调用本机 API Delphi 不附带本机 API 的标头翻译 因此 您需要提供自己的翻译 或使用预先存在的翻译
  • Java可以用来写Win32系统服务吗?

    标题有点概括了 我正在考虑使用Jabaco http www jabaco org因为它生成 EXE 以及 jar 文件 而且我对 VB 语法比对 Java 更熟悉 你当然可以用Java 服务包装器 http wrapper tanukis
  • 如何确保 IsInRole 检查不使用缓存的凭据

    我有一个连接到 WCF 服务的 WPF 客户端 我想锁定某些功能 以便只有某些用户可以执行某些操作 WCF 服务在执行服务方法时模拟客户端用户 操作系统是Windows XP 我正在读书这个问题 https stackoverflow co

随机推荐

  • 如何防止 JMenuItem 在单击 JMenuItem 时关闭菜单

    我该如何预防JMenuItem从关闭菜单时JMenuItem被点击了 The JMenuItem已启用 这就是场景 我有 3JMenuItems JMenuItem A B C C显示一个整数X A和B用于递增或递减X值 1 如果单击 A
  • jQuery 将一个表按特定行号拆分为两个表

    我需要使用 jQuery 将一个表分成两个具有特定行号的表 这可以做到吗 我用谷歌搜索但找不到任何东西 jQuery 相当强大 我本来以为可以做到这一点 该表没有编号 因此 jQuery 需要对行进行索引 非常感谢对此的任何帮助 C jQu
  • 模板渲染期间需要解压的值太多

    我现在正在学习 Django 遇到了这个错误 我有点困惑 我正在尝试将我的表格放到我的主页上 我收到此错误 code 主页 views py from django shortcuts import render from forms im
  • 用不同颜色绘制线

    import pandas as pd import matplotlib pyplot as plt import numpy as np df1 pd DataFrame np random randint 0 15 size 15 1
  • iPhone 中真正的模态 UIAlertView?

    我需要运行一些取决于用户决定的验证 例如 如果批准超出支出限额的购买 并在失败时拒绝 完成 操作 然而 看起来不可能像其他语言那样有真正的模态操作 如 showmessage alert 等 并且一切都是由委托完成的 但后来我不知道该怎么办
  • 未找到 javac1.8 类

    我安装了两个jdk jdk 1 5和jdk 1 8 我有以下 Ant build xml 配置文件
  • 在 Google App Engine for Python 中使用 xlsxwriter

    我想知道是否有人知道如何在 Google App Engine for Python 中使用 xlsxwriter 该文档仅显示如何打开 写入和保存到文件 我已经研究过使用 StringIO 用于其他 Excel 库的解决方法 但它们似乎无
  • 从哪里上传应用程序二进制文件在应用程序商店

    我已按照所有步骤在 https itunesconnect apple com WebObjects iTunesConnect woa 上上传我的第一个应用程序 最后我上传了大图和屏幕截图 我无法选择上传二进制文件 现在申请状态为 等待上
  • 在 Bash 中锁定文件

    我有一个问题要找到一个在 bash 中锁定文件的好概念 基本上我想实现以下目标 锁定文件 读入文件中的数据 多次 用数据做事 将新内容写入文件 不一定到最后 解锁该文件 对我来说 用集群执行此操作似乎是不可能的 因为文件描述符只会移动一次到
  • SQL 按查询中指定的顺序排序

    假设我有一个查询 select from Clauses where id in 0 2 5 1 3 我实际上希望按照在 where 子句中指定的顺序返回行 ID 的顺序会因查询而异 并且顺序没有模式 我知道可以改变数据模型 创建临时表等
  • 切片插入问题,L[1:1]

    练习一些Python 这是一种很容易掌握的语言 I have gt gt gt L 1 2 3 4 gt gt gt L 1 1 1 2 3 gt gt gt L 1 1 2 3 2 3 4 所以实际上在第二行L 1 1 是空列表 但是py
  • 自动 Beta 版本与 crashlytics

    我的 Android 应用程序有一个包含 crashlytics start 的库 我只将 Crashlytics jar 设置为 Library 项目的依赖项 构建成功 我也在 app gt build gradle 文件中配置了多种风格
  • 如何将 iCloud 权限添加到应用程序 ID?

    如何将 iCloud 权利添加到应用程序 ID 我只想在 iCloud 中使用键值存储 我通过编辑现有的 iOS 应用程序 ID 启用了 iCloud 然后 生成新的配置文件 将其安装在 XCode 中 我添加了我的应用程序包 IDcom
  • -32768 不适合 16 位有符号值

    我正在使用 PCLint v 9 00h 在我的代码中 我有以下内容 其中 S16 是带符号的 16 位 S16 temperatureResult 32768 除非我的大脑停止工作 否则这是适合这种类型的最小值 但我收到了 违反 MISR
  • 从多个值列表中查找所有不冲突的值组合

    我有以下数组 其中包含值数组 array array array 1 2 array a b c array x y 可以有任意数量的数组 并且数组可以包含任意数量的值 我目前有一段代码 它将生成所有组合 其中从每个数组中获取一个值 例如
  • 如何获取PHP运行的操作系统?

    为了构建 unix dos 特定的脚本 我需要知道我使用的是哪种操作系统 我如何获得这些信息 phpinfo 告诉我更多 但不太清楚我是否在 unix 上运行 PHP有很多预定义常量这通常很有用 Here PHP OS就是您正在寻找的人 例
  • 如何从存储过程发送邮件?

    我需要从存储过程发送邮件 我知道这是可能的 我是从这个研究的link 我如何在 SMTP 服务器上进行身份验证 你有什么主意吗 Thanks 您可以使用 SQL 数据库邮件 See 数据库邮件和 SQL 邮件存储过程 Transact SQ
  • 如何使用pygtk拖动图像

    如何使用 pygtk 拖动 移动图像 Here是有人这样做的视频 但是该人没有给出源代码 这是一个小演示 抱歉 我不记得它到底来自哪里 它与此处找到的非常相似 http www pygtk org pygtk2tutorial exampl
  • elasticsearch 分割文档摄取处理器

    弹性搜索提供了ingest在索引文档时转换文档的机制 处理器可以转换字段 在索引文档中添加和删除字段 对于极少数情况 甚至可以编写自己的转换插件 然而 我找不到为单个输入文档生成多个输出文档的可能性 这是否可以使用ingest弹性模块 我想
  • 我的程序如何检测它是否在特定域上运行?

    我需要根据当前登录用户的位置限制应用程序的特定功能 由于我必须在 Delphi 中实现此逻辑 因此我不希望过度使用完整的 Active Directory LDAP 查询 我当前的想法是利用 DsGetDcName 并使用 DOMAIN C