
■やりたいこと
エクセル(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(エクセル)
-
VBAでActiveDirectoryのユーザ一覧の取得の仕方
Visual Basic(VBA)
-
ExcelVBAで今開いているユーザ情報を取得できますか?
Visual Basic(VBA)
-
-
4
VBAでサーバーにアクセスするにはどうすればいいの?
Access(アクセス)
-
5
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
6
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
7
Excelのセルにユーザー名を表示する方法
Excel(エクセル)
-
8
共有フォルダにアクセスする際のパスワード入力を自動化したい
Mac OS
-
9
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
10
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
11
net useのユーザー名を変数で通したい
Access(アクセス)
-
12
エラーになってないのにVBAが中断される
Excel(エクセル)
-
13
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
14
エクセルでメッセージボックスにパスワードを入力し、ブックの保護を解除するマクロを教えて下さい
Excel(エクセル)
-
15
Access VBAから使用したExcelプロセスを閉じる方法について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル(VBA)でWindowsのサイ...
-
windows vistaのログインパスワ...
-
パソコンの操作履歴を見たい。
-
ネットワーク管理者にアクセス...
-
AdministratorsとDomain Admins...
-
ネットワーク ログオン サービ...
-
Outlookに「同期に失敗」という...
-
postfixでfromのhost名がunknow...
-
wwwとwww2の違い
-
IPアドレスからOSを割り出す方法
-
ほかの人がこのコンピュータに...
-
青と黄色の盾みたいなマークの意味
-
新規で別アカウントを作成した...
-
ログオフからの自動ログオンが...
-
ショートカットエラーとは?
-
ユーザープロファイルの重複
-
ドメイン離脱時のセキュリティ...
-
どうしてbzやtvといったドメイ...
-
NTドメインのユーザープロファ...
-
プロバイダのメールアカウント...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセル(VBA)でWindowsのサイ...
-
PCを自分以外に使わせないよう...
-
パソコンのパスワード忘れた時...
-
Administratorの初期パスワード?
-
パソコンを特定の人しか使用で...
-
windows vistaのログインパスワ...
-
パソコンの操作履歴を見たい。
-
ログオンメッセージ( 指定さ...
-
『開始するにはユーザー名をク...
-
ユーザーアカウントとは別にス...
-
win7 ログオン画面が出ない
-
Windows7のログインパスワード...
-
ネットワーク管理者にアクセス...
-
AdministratorsとDomain Admins...
-
wwwとwww2の違い
-
Outlookに「同期に失敗」という...
-
ドメインユーザーのユーザー名...
-
ネットワーク ログオン サービ...
-
青と黄色の盾みたいなマークの意味
-
移動プロファイルを固定プロフ...
おすすめ情報
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サインイン時のもので間違いありません。
なぜエラーになるのか不明です。
ちなみに、ドメイン名とユーザー名を取得してるのように、パスワードも取得できると思うのですが、どのように記述すればよいでしょうか。
以上