
■やりたいこと
エクセル(VBA)でパスワードの入力を要求して、それがWindowsのその人のサインイン時のパスワードと一致しているかどうかを判別したい
■詳細
添付画像をご覧ください。
ある共有ファイルがあり、そこにはユーザー名(AAA~DDD)が掲載されています。
そしてその隣にはその人たちの情報(○ or ×)が記載されいます。
この情報列の内容を編集できるのは、各ユーザーのみに制限をしたいのです。
そこで、各ユーザーのWindowsサインイン時のパスワードの入力を求められないかと思っています。
同環境のある別のシステムでは、サインインするときに、Windowsのサインイン情報と同じ情報が求められます。
サインインパスワードを変更したら、そのシステムにサインインする際は新しいパスワードの入力がもとめられます。
ということは、そのシステムはサインインパスワードを認識してるということになります。
なので、エクセルのこの状況でも同様の仕組みにできるのではないかと思いました。
別アプローチ(代替案)はいろいろ考えられるので、それは求めておらず、今回のアプローチ方法が技術的に可能かどうか、可能であれば具体的にどのような処理をすればよいかを知りたいです。
VBAは熟知しています。
もしかしたら、Windowsのサインイン情報がPC管理をしているサーバーに飛んで、別システムはそこを参照しているのかな?とも思っています。
そうなるとそのサーバーにアクセスは難しいので、同じアプローチは不可と思っています。
■動作環境
OS 名:Microsoft Windows 10 Pro
OS バージョン:10.0.16299 N/A ビルド 16299
OS 製造元:Microsoft Corporation
プロセッサ:Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~2400 Mhz
BIOS バージョン:TOSHIBA Version 2.20 , 2012/06/22
物理メモリの合計:3,988 MB
Excel バージョン:14.0.7192.5000(32ビット) Microsoft Office Standard 2010の一部
以上、心当たりあるかた、よろしくお願いいたします<(_ _)>

No.1ベストアンサー
- 回答日時:
情報が足りずほとんど想像ですのでご容赦ください。
A) ユーザー アカウントの管理は Active Directory を使っている。
B) 現在ログオンしているユーザー アカウントは PC のローカルにあるアカウントではなく、AD のアカウントである。
C) 現在ログオンしているユーザー アカウントは、現在 PC を使用している個人のアカウントである。
以上より、アカウント名とパスワードの組み合わせの正当性評価は Active Directory のサーバーが行います。
評価してもらう処理は強い権限は必要ありません。 一般ユーザーの権限で大丈夫です。
評価に使う要素は 「自分が所属する Active Directory ドメイン名」「アカウント名」「パスワード文字」 の 3つで、ドメイン名とアカウント名は自動取得とし、パスワードだけを指定するようにしました。
ユーザー名をこちらから指定できないようにしたので簡易的ですが成りすましを防止したつもりです。
もっとも、質問者さんの環境を勝手に想像したものなので使い物にならない可能性もあります。
ユーザー確認が成功したら True、失敗したら False を返すようにしたので
If AuthenticateUser("パスワード文字") Then
' 成功
Else
' 失敗
End If
のように使います。
Function AuthenticateUser(aPassword As String) As Boolean
' 戻り値
Dim result As Boolean
' ユーザーのアカウント名と所属ドメイン名を取得
Dim objSysInfo As Object
Dim objUser As Object
Set objSysInfo = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & objSysInfo.userName)
Dim userAccountName As String
Dim adName As String
userAccountName = objUser.sAMAccountName
adName = objSysInfo.DomainDnsName
' 自動取得したユーザー情報と指定されたパスワードを使い、Active Directory のユーザー確認を行う
On Error Resume Next
Err.Clear
Dim objLdap As Object
Dim objOpenDS As Object
Set objNS = GetObject("LDAP:")
Set objOpenDS = objNS.openDSObject("LDAP://" & adName, userAccountName, apasword, 1)
On Error GoTo 0
If Err.Number = 0 Then
' 確認成功
result = True
Else
' 確認できず
result = False
End If
AuthenticateUser = result
End Function
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
マクロでネットワーク上のコンピューターへの接続
Excel(エクセル)
-
ExcelVBAで今開いているユーザ情報を取得できますか?
Visual Basic(VBA)
-
VBAでActiveDirectoryのユーザ一覧の取得の仕方
Visual Basic(VBA)
-
-
4
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
5
VBAでサーバーにアクセスするにはどうすればいいの?
Access(アクセス)
-
6
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
7
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
8
Access サブフォームでの選択行の取得
その他(データベース)
-
9
Excelのセルにユーザー名を表示する方法
Excel(エクセル)
-
10
VBA ファイルを開くダイアログでの初期表示にファイルサーバーを指定
Excel(エクセル)
-
11
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
12
Excel VBA Windowsにログインしているユーザ名
Excel(エクセル)
-
13
現在アクティブなタブのページ名を取得したい
Access(アクセス)
-
14
エクセルでメッセージボックスにパスワードを入力し、ブックの保護を解除するマクロを教えて下さい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PCを自分以外に使わせないよう...
-
エクセル(VBA)でWindowsのサイ...
-
Administratorの初期パスワード?
-
ネットワーク管理者にアクセス...
-
wwwとwww2の違い
-
AdministratorsとDomain Admins...
-
Outlookに「同期に失敗」という...
-
青と黄色の盾みたいなマークの意味
-
ドメイン離脱時のセキュリティ...
-
windows xpでコンピューターの...
-
「システム情報」での「システ...
-
NetBios名のユニークの重複につ...
-
Cドライブ/ユーザー/XXXにTEMP....
-
同一フォレストにADサーバが複...
-
Domain環境でのPowerUsers
-
ひとつのIPで二つ以上のドメイ...
-
パソコンに写真の自動取り込み停止
-
ドメインユーザーのユーザー名...
-
GOM PLAYERで画面の下が切れる...
-
IEを開くと常にPhishWallが出る
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセル(VBA)でWindowsのサイ...
-
PCを自分以外に使わせないよう...
-
Administratorの初期パスワード?
-
XPの立ち上がりのときの画面
-
ログオン手続きの煩わしさ
-
家族にばれない方法
-
Windowsメール パスワードの...
-
ユーザーの設定について
-
LAN上のプリンターに接続できない
-
スクリーンセーバーを消すと毎...
-
パスワード忘れ
-
管理者パスワードを忘れた ど...
-
Windows XP Proでのユーザーア...
-
自分のユーザーアカウントで、...
-
ログインパスワードを忘れてし...
-
Ctrl+Alt+Delキー押してもパス...
-
ログインが自動でされる
-
【Windows Vista】ログインアカ...
-
『開始するにはユーザー名をク...
-
WinXPのログオン変更等
おすすめ情報
Active Directoryというのを初めて知りました。
無知な分野ですので、見当違いのことを言ってる可能性がありますが、ご容赦ください。
ご提示いただいたマクロを実行したところ、エラーなく実行されました。
(Set objOpenDS = ..... apaswordの部分は「aPassword」に修正しました)
しかし、パスワードはどれを使用しても、結果は「成功」となってしまいました。
Debug.Print userAccountName, adName
で値を確認すると、正しい値でした。
正確には「adName」はlocal.....というもので、これが正しいかわかりませんが、ドメイン名と一致してるので正しいと予想しています。
以下、2点不明点があります。
■不明点1
On Error Resume Next以下、
Set objOpenDS = objNS.openDSObject("LDAP://" & adName, userAccountName, aPassword, 1)
で、「自分が所属する Active Directory ドメイン名」「アカウント名」「パスワード文字」の組み合わせが正しければ、エラーにならず、組合せが確認できなければ、エラーになると認識しています。
今回aPasswordでどんな値でも結果は成功となりました。
そこで、On Error Resume Nextを外してみたところ、
実行時エラー '-2147023570 (8007052e)':
オートメーション エラーです。
ユーザー名またはパスワードが正しくありません。
というメッセージがでました。
Err.Numberの数値を確認すると、メッセージ画面のとおり「-2147023570」でした。
しかし、その後If Err.Number = 0 ThenではTrueを返しています。
この理由は不明です。
そこで、On Error Resume NextをOn Error GoTo Label_Err
に変えてやると、この場合はエラーと認識して、Label_Err:に飛びました。
■不明点2
上記対応時に判明したのですが、実はパスワードは正しいものでも、エラー(-2147023570)が発生していました。
パスワードは確認しましたが、Windowsサインイン時のもので間違いありません。
なぜエラーになるのか不明です。
ちなみに、ドメイン名とユーザー名を取得してるのように、パスワードも取得できると思うのですが、どのように記述すればよいでしょうか。
以上