我是running PHP,Apache和窗户。我没有一个领域设置,所以我想我的网站的形式基于身份验证用当地用户账户数据库内建Windows(我认为这是叫SAM)。

我知道,如果主动目录设置,可以使用的PHP LDAP模块进行连接和进行身份验证,在你脚本,但没有广告没有LDAP。什么是相当独立机?

有帮助吗?

解决方案

我还没有找到一个简单的解决办法。有一些例子使用则和WinNT堆提供者。但他们最终都会碰到 用户身份验证问题的活动目录服务接口WinNT提供者.我不是100%肯定但是我 猜测 WSH/网络连接的方法具有同样的问题。
根据 如何验证用户证书上Microsoft操作系统 你应该使用LogonUser或像.
它还说

LogonUser Win32 API does not require TCB privilege in Microsoft Windows Server 2003, however, for downlevel compatibility, this is still the best approach.

在Windows XP,它不再需要这一进程有SE_TCB_NAME特权,以便叫LogonUser.因此,最简单的方法来验证用户证书上的Windows XP,是要叫LogonUser API。

因此,如果我们的某些Win9x/2000支持不需要我会写一扩展,暴露了LogonUser php.
你也可能有兴趣 用户认证从NT帐户.它使用w32api扩展,并需要一个支持dll...我宁可写小LogonUser扩展;-)
如果这不可行我可能会看到fastcgi模块,用IIS和如何稳定的就是,让IIS处理的认证。

编辑:
我还想利用 系统。安全。校长。WindowsIdentity 和php的 com/.网的扩展.但dotnet构造似乎不允许通过参数的目的构造和我"实验",以获得大会(和与它CreateInstance())从GetType()未能以一个"未知变量容器"的错误。

其他提示

问得好!

我已经给这些思想...我不能想到一个很好的解决方案。什么我可以认为是一个可怕的可怕的黑客,只是可能的工作。在看到没有人张贴到这个问题的答案对于几乎一天,我想到个坏,但工作的答案会确定。

SAM文件是关闭的限制,而该系统正在运行。有一些DLL注入技巧,你可能能够获得工作但最后你就会结束了密码哈希而且你必须散列提供的用户密码,以匹配对他们无论如何。

你真正想要的是什么,试图以验证用户对SAM的文件。我觉得你可以做该做的事有如下述。

  1. 创建一个文件共享服务器上,并使它如此,只有帐户希望能够记录在作为被授予访问权限。
  2. 在PHP使用该系统的命令要援引一个wsh脚本是:装载的分享使用用户名和密码,该网站的用户提供。记录如果它的工作,然后卸载的驱动,如果它。
  3. 收集的结果以某种方式。结果,可以回到php无论是在stdout的脚本,或者希望采用的返回代码脚本。

我知道这不是很漂亮,但它应的工作。

我觉得脏:|

编辑:原因在于援引外部wsh脚本是PHP不允许使用UNC路径(尽我所能记得).

建立一个PHP扩展需要一个相当大的投资条款的硬盘空间。因为我已经有海湾合作委员会(MinGW)环境安装的,我已决定采取的绩效打击启动一个进程,从PHP script.源代码如下。

// Usage: logonuser.exe /user username /password password [/domain domain]
// Exit code is 0 on logon success and 1 on failure.

#include <windows.h>

int main(int argc, char *argv[]) {
    HANDLE r = 0;
    char *user = 0;
    char *password = 0;
    char *domain = 0;
    int i;

    for(i = 1; i < argc; i++) {
        if(!strcmp(argv[i], "/user")) {
            if(i + 1 < argc) {
                user = argv[i + 1];
                i++;
            }
        } else if(!strcmp(argv[i], "/domain")) {
            if(i + 1 < argc) {
                domain = argv[i + 1];
                i++;
            }
        } else if(!strcmp(argv[i], "/password")) {
            if(i + 1 < argc) {
                password = argv[i + 1];
                i++;
            }
        }
    }

    if(user && password) {
        LogonUser(user, domain, password, LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &r);
    }
    return r ? 0 : 1;
}

接下来是PHP源表明其使用。

if($_SERVER['REQUEST_METHOD'] == 'POST') {
    if(isset($_REQUEST['user'], $_REQUEST['password'], $_REQUEST['domain'])) {
        $failure = 1;
        $user = $_REQUEST['user'];
        $password = $_REQUEST['password'];
        $domain = $_REQUEST['domain'];

        if($user && $password) {
            $cmd = "logonuser.exe /user " . escapeshellarg($user) . " /password " . escapeshellarg($password);
            if($domain) $cmd .= " /domain " . escapeshellarg($domain);
            system($cmd, $failure);
        }

        if($failure) {
            echo("Incorrect credentials.");
        } else {
            echo("Correct credentials!");
        }
    }
}
?>
<form action="<?php echo(htmlentities($_SERVER['PHP_SELF'])); ?>" method="post">
    Username: <input type="text" name="user" value="<?php echo(htmlentities($user)); ?>" /><br />
    Password: <input type="password" name="password" value="" /><br />
    Domain: <input type="text" name="domain" value="<?php echo(htmlentities($domain)); ?>" /><br />
    <input type="submit" value="logon" />
</form>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top